工厂搜索 依赖于关键词召回、没有做语义召回和精排,加上语义召回和精排则成本过高,所以对分词效果仍然很依赖。badcase: q=锦鸿 无法召回 锦鸿达 1. 虽然商品搜索已经不强依赖于分词效果,但是工厂搜索仍然对分词效果有很大依赖,所以进行了优化。 2. 优化内容: 1) index_ansj + 自定义词典(需要配置自定义词典。 不配置自定义词典的时候,index_ansj分词结果和query_ansj完全一致,配置自定义词典时,index_ansj 将 ) 2) ansj自定义词典 补充属性词 | Query | IK_Smart 分词结果 | IK_Max_Word 分词结果 | |---------|---------------------------------------------|--------------------------------------------------| | 锦鸿达 | 锦, 鸿达 | 锦, 鸿达 | | 锦鸿 | 锦, 鸿 | 锦, 鸿 | | 14寸 4代 | 14寸, 4代 | 14, 寸, 4, 代 | | q=14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝 | 14寸, 第, 4代, 眼珠, 实, 身, 冰雪, 公, 仔, 带, 手动, 大, 推车, 搪, 胶, 雪, 宝宝 | 14, 寸, 第, 4, 代, 眼珠, 实, 身, 冰雪, 公仔, 带, 手动, 大, 推车, 搪, 胶, 雪, 宝宝 | | 金毛犬-狗狗系列积木套 | 金毛犬, 狗狗, 系列, 积木, 套 | 金毛犬, 狗狗, 系列, 积木, 套 | | Query | query_ansj 分词结果 | index_ansj 分词结果 | |---------|------------------------------------------|--------------------------------------------------| | 锦鸿达 | 锦, 鸿达 | 锦, 鸿达, 鸿, 达 | | 锦鸿 | 锦鸿 | 锦鸿, 锦, 鸿 | | q=14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝 | 14寸, 第, 4代, 眼珠, 实, 身, 冰雪, 公仔, 带, 手动, 大, 推车, 搪, 胶, 雪, 宝宝 | 14寸, 寸, 第, 4代, 代, 眼珠, 眼, 珠, 实, 身, 冰雪, 冰, 雪, 公仔, 公, 仔, 带, 手动, 手, 动, 大, 推车, 推, 车, 搪, 胶, 雪, 宝宝, 宝 | | 金毛犬-狗狗系列积木套 | 金毛犬, 狗狗, 系列, 积木, 套 | 金毛犬, 金毛, 金, 毛, 犬, 狗狗, 狗, 系列, 系, 列, 积木, 积, 木, 套 | ansj 插件自定义词典补充属性词后: | Query | query_ansj 分词结果 | index_ansj 分词结果 | |---------|------------------------------------------|--------------------------------------------------| | 锦鸿达 | 锦, 鸿达 | 锦, 鸿达, 鸿, 达 | | 锦鸿 | 锦鸿 | 锦鸿, 锦, 鸿 | | q=14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝 | 14寸, 第, 4代, 眼珠, 实身, 冰雪, 公仔, 带, 手动, 大, 推车, 搪胶, 雪, 宝宝 | 14寸, 寸, 第, 4代, 代, 眼珠, 眼, 珠, 实身, 实, 身, 冰雪, 冰, 雪, 公仔, 公, 仔, 带, 手动, 手, 动, 大, 推车, 推, 车, 搪胶, 搪, 胶, 雪, 宝宝, 宝 | | 金毛犬-狗狗系列积木套 | 金毛犬, 狗狗, 系列, 积木, 套 | 金毛犬, 金毛, 金, 毛, 犬, 狗狗, 狗, 系列, 系, 列, 积木, 积, 木, 套 | ## ik分词器的问题: ```bash POST spu/_analyze { "analyzer": "ik_smart", "text": "14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝" } POST spu/_analyze { "analyzer": "ik_max_word", "text": "14寸第4代-眼珠实身冰雪公仔带手动大推车,搪胶雪宝宝" } # ik分词器的问题: # ik_max_word 结果是: 14 寸 第 4 代 # 期望是能分出多种形式: 14 寸 14寸 第 4 代 4代 # ik_smart # 结果是: 14寸 第 4代 # 因此 14寸 4代 都无法召回原始文档。 ``` ## ansj分词器的问题: ### 1. index_ansj不符合预期 index模式(type=index_ansj)不符合预期 :type=index_ansj type=query_ansj 结果永远都是一样的。 https://github.com/NLPchina/elasticsearch-analysis-ansj/issues/235 已解决:需要配置自定义词典 ### 2. 特殊符号分词粘连问题 特殊符号(减号)会跟后面的词粘连到一起,导致搜索减号后面的词,无法匹配: ```bash GET /_cat/ansj?text=狗狗系列-柴犬积木&type=index_ansj { "name": "-柴", "nature": "nrf", "offe": 4, "realName": "-柴", "synonyms": null }, GET /_cat/ansj?text=狗狗系列-哈士奇犬&type=index_ansj { "name": "-哈士奇", "nature": "nrf", "offe": 4, "realName": "-哈士奇", "synonyms": null }, ``` 这样的话,如果搜索“柴犬”、“哈士奇”,就不能命中上面的句子。 暂时解决办法是: ```json "analyzer": { "index_ansj": { "type": "custom", "char_filter": ["hyphen_to_space"], "tokenizer": "index_ansj" }, "query_ansj": { "type": "custom", "char_filter": ["hyphen_to_space"], "tokenizer": "query_ansj" } } ```