在es全局检索的需求中,需要进行多个分词器同时匹配关键词,例如:
在商品名称、品牌名称和类目名称中匹配含有“西”关键字的查询结果,当一个字段匹配时即加入查询结果
用sql语句表达为:select * from item where item_name like '%西%' or brand_name like '%西%' or c_name like '%西%'
其中item_name,brand_name,c_name分别商品名称、品牌名称和类目名称
这个简单的需求在es中却实现比较困难,原因是es在索引数据时会针对字段内容进行分词,下面列出es几种分词器的特性:
1)standard分词器
es默认的分词器,对中文支持不友好,会将中文分成单字,这样在查询多个汉字时就匹配不到doc,所以针对中文字段可使用ik
2)ik分词器
需要单独安装ik插件,有ik_smart和ik_max_word两种分词粒度,其中ik_max_word粒度更细,但如果ik识别不出的词,就不会分出
导致上边的全局检索例子查询“西”时匹配不到数据
3)pinyin分词器
需要安装插件,可支持拼音全拼、简拼和首字母查询
鉴于以上分词器的特性,在全局检索时可能需要使用几种分词器同时工作,那这种需求该如何来处理呢?答案是使用multi_field
以下为multi_field的mapping:
{
"item" : {
"properties" : {
"item_name" : {
"type" : "multi_field",
"fields" : {
"item_name_ik" : {"type" : "string", "analyzer" :"ik"},
"item_name_not" : {"type" : "string", "index" : "not_analyzed"},
"item_name_standard" : {"type" : "string"}
}
},
"brand_name" : {
"type" : "multi_field",