Elasticsearch+ik-analyzer 下,如何实现单字搜索?如“珀”=>“琥珀”

2016-09-05 10:14:41 +08:00
 dangyuluo

复现很简单,在某个索引的某个字段中创建一个type: string, analyzer: ik_smart的字段,假设名为 description 。然后填入这么一条数据:“主要经营缅甸琥珀蜜蜡各类产品 翡翠各类成品及半成品 18k 金镶嵌成品 低中高价位齐全 产品款式 大量库存”

通过 ik_smart 分词器查看其分词结果:(截取部分)

...
{
      "token": "琥珀",
      "start_offset": 6,
      "end_offset": 8,
      "type": "CN_WORD",
      "position": 3
},
...

可以看出琥珀被分为一个词了。那么再进行以下查询,仅查找“珀”字:

{
    "query": {
        "match": {
            "feature": "珀"
        }
    }
}

结果却找不到该字。我认为原因应该是, ik_smart 将“琥珀”认为是一个词后,为这个词进行了索引。那么搜索“珀”字自然找不到这条数据,只能说ik analyzer太智能了。

通过测试,发现自带 standard 分词器是可以通过搜索“珀”字,搜索到含有“琥珀”的数据的。原因明显是因为 standard 分词器会拆分每个汉字。

不知道各位都怎么解决这个问题,谢谢。

7082 次点击
所在节点    Elasticsearch
5 条回复
xujif
2016-09-05 11:26:18 +08:00
type 用 phrase 不然就自己添加词库字典
marffin
2016-09-05 11:59:01 +08:00
同时加一个 1gram 的 analyzer 就好
lyroge
2016-09-05 12:03:59 +08:00
添加一列,用 standard 分析器?
Suclogger
2016-09-05 12:35:55 +08:00
建立索引需要细粒度,检索需要粗粒度

意味着

index_analyzer 用 ik_max_word
query_analyzer 用 ik_smart
woyaojizhu8
2016-09-06 21:03:03 +08:00
微软全系的搜索也有这个问题,比如 windows 搜索 , onenote 搜索 , sql server 搜索

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/303943

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX