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