复现很简单,在某个索引的某个字段中创建一个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 搜索
|