
复现很简单,在某个索引的某个字段中创建一个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 分词器会拆分每个汉字。
不知道各位都怎么解决这个问题,谢谢。
1 xujif 2016-09-05 11:26:18 +08:00 type 用 phrase 不然就自己添加词库字典 |
2 marffin 2016-09-05 11:59:01 +08:00 同时加一个 1gram 的 analyzer 就好 |
3 lyroge 2016-09-05 12:03:59 +08:00 添加一列,用 standard 分析器? |
4 Suclogger 2016-09-05 12:35:55 +08:00 建立索引需要细粒度,检索需要粗粒度 意味着 index_analyzer 用 ik_max_word query_analyzer 用 ik_smart |
5 woyaojizhu8 2016-09-06 21:03:03 +08:00 微软全系的搜索也有这个问题,比如 windows 搜索 , onenote 搜索 , sql server 搜索 |