1
sss15 246 天前
第一个问题,不知道
按照我的理解 ik_max_word 会将词拆分到最细,所以 XL 汤锅,理应通过锅能搜索到的,插个眼看个答案。 第二个问题 护肝 2 个字应该是搜索词也被分词了,所以护肝被拆成了护和肝 ,这个可以通过 2 种方式解决,一种是用 keyword 进行搜索,这样搜索词不会被分词。 另外一种是指定搜索词的分词器为 ik_smart 这样分的词会尽量的少 |
2
ghostwind 246 天前
1. 第一个问题的话,你看下是不是汤锅变成了一个实体词。
2. 之前我们做的时候是 case by case 你把护肝作为一个实体词,不允许拆分。 PS:单字的搜索可以不优化,因为不准 |
4
wu00 246 天前 1
es 也有 explain 的自己看一下就知道了
另外查询时最好也要指定分词器,比如你的关键词是”护肝”,用 A 分词器能分出 3 个词,B 分词器分出 1 个 1 ,ik_max_word 也无法将"汤锅"拆分出“锅”,自己用_analyze 试下就知道了 2 ,ik_max_word 可将“护肝”拆分成“护”和“肝”,需要自行维护词库 |
6
996635 246 天前
关键词:HMM
|
7
wu00 246 天前
大厂咱不知道,肯定没这么简单,应该有搜索引擎团队。
你这种针对分词器维护一下行业词库,最多再做做 BM25 相关度调优就差不多了.. |
9
zakokun 246 天前 1
ES 支持指定 tokenizer 做分词测试,你可以指定你们线上用的 tokenizer ,然后把商品名称输入进去,查看返回分词结果.
按照你给的例子,第一个情况是分词器把你“汤锅”作为一整个 token ,所以用“锅”搜不到; 第二个情况是分词器拆分出“护”这个 token ,然后你的关键词也拆出了“护”,所以匹配到了。 规则和搜索匹配方式都需要开发自己去指定,包括匹配度,还有分词器,停用词,词库什么的,要和产品商量好。 |
12
chippai 246 天前
1. 汤锅是一个词,在 ik-max-word 分完后创建的是一个完整的汤锅索引,所以锅搜不出来
1.1 将锅加到自定义词典,可以分为汤锅/锅,就可以检索到了 1.2 对一些单字通过 should 模糊匹配去搜,可以降低一些分值排在后面 2. 护关节被分为护/关节,护肝分为护/肝,护匹配到了 2.1 增加护关节、护肝自定义词典,然后使用 ik-smart 去搜索 通过命令查看 es 是咋分的 POST _analyze { "analyzer": "ik_max_word", "text": "护关节" } |
13
chippai 246 天前 1
2.2 可以先将 query 词使用 match_phrase 函数,然后 should 上 match 函数;增加 match_phrase 的分值权重
|
14
publicWyt 246 天前
这个时候就要参考一下 PDD 等网站了,搜搜看汤锅,商家的 title 是很大一串的相关锅词汇,目测是为了提高检索的命中,也为了让分词器更精准的分离出关键词,汤锅在_analyze 确实是不会分词到锅,但是平底锅高压锅等乱七八糟的都可以
|
15
matrix1010 245 天前 via iPhone
商品名这种短字符就别 ik 了,直接单字+2gram
|