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