公司做的商城项目,搜索商品用的 es ,分词器使用的 ik ,在使用 ik_max_word 做搜索的时候查询结果会有些问题 比如一个商品是 XL 汤锅,搜索锅是查询不到的 某个商品为 XX 护关节钙片,搜索护肝是可以搜索到的(运营的意思是应该搜索不到) 有大佬给支个招吗?
第一个问题,不知道 按照我的理解 ik_max_word 会将词拆分到最细,所以 XL 汤锅,理应通过锅能搜索到的,插个眼看个答案。 第二个问题 护肝 2 个字应该是搜索词也被分词了,所以护肝被拆成了护和肝 ,这个可以通过 2 种方式解决,一种是用 keyword 进行搜索,这样搜索词不会被分词。 另外一种是指定搜索词的分词器为 ik_smart 这样分的词会尽量的少
es 也有 explain 的自己看一下就知道了 另外查询时最好也要指定分词器,比如你的关键词是”护肝”,用 A 分词器能分出 3 个词,B 分词器分出 1 个 1 ,ik_max_word 也无法将"汤锅"拆分出“锅”,自己用_analyze 试下就知道了 2 ,ik_max_word 可将“护肝”拆分成“护”和“肝”,需要自行维护词库
ES 支持指定 tokenizer 做分词测试,你可以指定你们线上用的 tokenizer ,然后把商品名称输入进去,查看返回分词结果. 按照你给的例子,第一个情况是分词器把你“汤锅”作为一整个 token ,所以用“锅”搜不到; 第二个情况是分词器拆分出“护”这个 token ,然后你的关键词也拆出了“护”,所以匹配到了。 规则和搜索匹配方式都需要开发自己去指定,包括匹配度,还有分词器,停用词,词库什么的,要和产品商量好。