带你读《Elastic Stack 实战手册》之32:——3.4.2.17.1.Multi-field(上)

简介: 带你读《Elastic Stack 实战手册》之32:——3.4.2.17.1.Multi-field(上)

3.4.2.17.Text analysis, settings 及 mappings

3.4.2.17.1.Multi-field


创作人:金端

审稿人:欧阳楚才

 

同一个字段可以使用不同的索引方式,实现不同的查询用途。比如,字符串类型字段可以设置成 text 字段用于全文检索,同时作为 keyword 字段用于排序或聚合。

 

Multi-field 主要通过 mapping 中的 fields 参数实现。

 

主要实现方法如下:


PUT test-000001
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "keyword": { 
            "type":  "keyword"
          }
        }
      }
    }
  }
}

ES 默认一个字符串字段会被设置成 text 和 keyword 两种字段格式,text 可以支持全文搜索,而 keyword 用于精确搜索和聚合排序。以上面定义的 city 字段作为案例,向 test-000001 索引添加数据:

 利用 text 字段类型进行全文检索,利用 keyword 字段类型进行聚合和精确搜索


GET test-000001/_search
{
  "query": {
    "term": {
      "city": "york" 
    }
  },
  "sort": {
    "city.keyword": "asc" 
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.keyword" 
      }
}
  }
}

返回结果如下:


{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
    // 根据全文搜索 york 并按照 asc 排序返回两个结果
      {
        "_index" : "test-000001",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : null,
        "_source" : {
          "city" : "New York"
        },
        "sort" : [
          "New York"
        ]
      },
      {
        "_index" : "test-000001",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : null,
        "_source" : {
          "city" : "York"
        },
        "sort" : [
          "York"
        ]
      }
    ]
  },
  "aggregations" : {
  // 根据 city.keyword 聚合的结果
    "Cities" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "New York",
          "doc_count" : 1
        },
        {
          "key" : "York",
          "doc_count" : 1
        }
      ]
    }
  }
}

当然在特殊的生产场景下,可能会有同一个字段需要分词器甚至多个字段类型的使用需求,这个 fields 也可以可以满足的。比如:title 字段实现 standard 和 english 两种分词器且有

keyword 字段类型。


PUT test-000002
{
  "mappings": {
    "properties": {
      "title": {
        "type": "keyword",
        "fields": {
        // 实现 standard 和 english 两种不同分词的子字段
          "standard": {
            "type": "text",
            "analyzer": "standard"
          },
          "english": {
            "type": "text",
            "analyzer": "english"
          }
        }
      }
    }
  }
}
由于不同的分词器产生的词根并不完全一致,面对不同的搜索场景,这种方式可以很好的优化搜索体验。比如,下面这种情况:
PUT test-000002/_doc/1
{ "title": "quick brown fox" } 
PUT test-000002/_doc/2
{ "title": "quick brown foxes" } 
通过 _analyze API 查看一下这两个文档的具体解析。
standard 分词器。
POST _analyze
{
  "analyzer": "standard",
  "text": "quick brown foxes"
}

结果:


{
  "tokens" : [
    {
      "token" : "quick",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "brown",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 1
},
    {
      "token" : "foxes",
      "start_offset" : 12,
      "end_offset" : 17,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}



《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.1.Multi-field(下) https://developer.aliyun.com/article/1230162

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
人工智能 计算机视觉
教程 |【阿里云.人脸识别】Access Key ID 和 Access Key Secret 查看方法
本章主要介绍阿里云.人脸识别 Access Key ID 和 Access Key Secret 查看方法。
|
9月前
|
IDE Linux 开发工具
IntelliJ IDEA最新版安装下载教程及安装教程(附安装包)
本文介绍IDEA的下载与安装教程,包含获取下载地址、安装步骤及激活方法。需注意安装路径为英文目录,运行激活脚本时需管理员权限。按指引操作即可完成激活并使用。
20629 0
|
缓存 NoSQL Java
RedisTemplate操作Redis,这一篇文章就够了
redis是一款开源的Key-Value数据库,运行在内存中,由C语言编写。企业开发通常采用Redis来实现缓存。同类的产品还有memcache 、memcached 等。
3609 1
|
5G 网络架构 UED
网速只拼Mbps?解码网速真相的五大关键因素
Mbps(兆比特每秒)是衡量数据传输速度的单位,表示每秒传输的百万比特数。它是评估网络性能的核心指标,广泛应用于家用宽带、移动网络和企业级网络中。Mbps 数值越高,理论上数据传输越快,但实际体验还受网络拥塞、丢包率和信号强度等因素影响。例如,在网络高峰时段或信号较弱的地方,即使Mbps数值高,也可能出现卡顿。5G和光纤技术显著提升了Mbps速率,但仍需考虑硬件设备如路由器和网卡的性能瓶颈。理解Mbps及其影响因素,有助于用户选择合适的网络服务并优化网络体验。
1350 1
|
存储 分布式计算 关系型数据库
Elasticsearch 8.X 导出 CSV 多种方案,一网打尽!
Elasticsearch 8.X 导出 CSV 多种方案,一网打尽!
|
监控 数据可视化 Java
【JAVA】分布式链路追踪技术概论
skywalking拥有更加的强大和细粒度的图形监控界面。
470 2
|
存储 索引 Python
Python中的列表(List) 详解与高级应用
Python中的列表(List) 详解与高级应用
1307 0
|
机器学习/深度学习 JSON Linux
NSLog日志输出不全问题分析与解决方案
NSLog日志输出不全问题分析与解决方案
678 0
|
SQL 前端开发 关系型数据库

热门文章

最新文章