项目场景:
在实际使用ES过程中,经常会遇到这样的问题:
既需要对一个字段进行全文检索,又要对该字段进行等值查询。
我们知道全文检索的字段类型需要设置为text,但是text字段类型又不支持term等值查询。那么怎么解决这个问题呢?
答案是通过fields进行多字段配置
fields说明
为了不同的目的以不同的方式索引相同的字段通常很有用。这就是fields多字段的目的。
例如,一个string 字段可以被映射为一个text类型用于全文搜索的keyword字段,以及一个keyword类型用于等值比较、排序或聚合的字段。
fields主要使用场景:
对一个字段配置多个类型的type以应对不同的查询场景
对一个字段配置多个分词规则以支持多种全文检索规则
多字段Multi-fields允许为不同目的以多种方式索引相同的字符串值,例如一个字段用于搜索和一个多字段用于排序和聚合,或者由不同的分析器分析相同的字符串值。
同字段多type配置
1、创建索引,在mapping中通过fields关键字给city字段添加别名raw,类型为keyword,用来做精确匹配以及排序。
PUT my-index-000001 { "mappings": { "properties": { "city": { "type": "text", "fields": { "raw": { "type": "keyword" } } } } } }
2、添加数据
PUT my-index-000001/_doc/1 { "city": "New York" } PUT my-index-000001/_doc/2 { "city": "York" }
3、查询
通过city.raw使用city的别名raw进行排序
GET my-index-000001/_search { "query": { "match": { "city": "york" } }, "sort": { "city.raw": "asc" }, "aggs": { "Cities": { "terms": { "field": "city.raw" } } } }
同字段多分词规则配置
有些场景,我们需要一个字段,满足多套分词规则的检索。
1、新建索引
字段text,默认采用standard analyzer分词器;
通过fields声明别名english,采用english分词器。
PUT my-index-000001 { "mappings": { "properties": { "text": { "type": "text", "fields": { "english": { "type": "text", "analyzer": "english" } } } } } }
2、添加测试数据
PUT my-index-000001/_doc/1 { "text": "quick brown fox" } PUT my-index-000001/_doc/2 { "text": "quick brown foxes" }
3、查询测试
说明:利用multi_match多字段匹配查询,实现一个字段多种分词规则检索。
GET my-index-000001/_search { “query”: { “multi_match”: { “query”: “quick brown foxes”, “fields”: [ “text”, “text.english” ], “type”: “most_fields” } } }
总结:
本文主要是介绍了ES中通过fields定义字段别名,实现对text字段进行精准匹配。
1、text字段用来做全文检索,keyword字段用来做等值匹配、排序和聚合运算。
2、怎么通过fields给字段定义别名
3、fields多字段的2种典型运用场景:
1个字段数据需要对应多个type类型
1个字段数据需要满足多种分词匹配规则