doc内容:
{"content":"中国人民银行"}
ik_max_word分词。
分词结果如下:
查询时,采用ik_max_word分词,会产生两个"中国"词。
即使使用了 "中国人 中国"~5 仍然不能命中。
如果指定查询时分词为ik_smart如下:
这是什么原因?
{"content":"中国人民银行"}
ik_max_word分词。
分词结果如下:
"tokens" : [
{
"token" : "中国人民银行",
"start_offset" : 0,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 0
},
{
"token" : "中国人民",
"start_offset" : 0,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 1
},
{
"token" : "中国人",
"start_offset" : 0,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "中国",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "国人",
"start_offset" : 1,
"end_offset" : 3,
"type" : "CN_WORD",
"position" : 4
},
{
"token" : "人民银行",
"start_offset" : 2,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 5
},
{
"token" : "人民",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 6
},
{
"token" : "银行",
"start_offset" : 4,
"end_offset" : 6,
"type" : "CN_WORD",
"position" : 7
}
]
查询条件如下:curl -XGET 'localhost:9200/chineseindex/_search?pretty' -d '{"explain":true,"query":{"query_string":{"fields":["content"],"query":"\"中国人 中国\""}}}'
查询词加了引号。"中国人"和“中国”的position一个是2,一个是3.应该是可以命中。事实是并不命中。查询时,采用ik_max_word分词,会产生两个"中国"词。
即使使用了 "中国人 中国"~5 仍然不能命中。
如果指定查询时分词为ik_smart如下:
curl -XGET 'localhost:9200/chineseindex/_search?pretty' -d '{"query":{"query_string":{"fields":["content"],"query":"\"中国人 中国\"", "analyzer":"ik_smart"}}}'
这样可以命中。这是什么原因?
5 个回复
medcl - 今晚打老虎。
赞同来自: rockybean 、lz8086 、jingkyks 、fishyou
2.查询条件加引号,查询处理的时候,会将引号内的查询关键字作为一个整体,重写为 phrase 查询;
关键点在于查询展开之后,附加了一个“中国”,这个中国是带有位置属性的(phrase),而在索引里面,是没有两个“中国”的,即需要保证先出现一个“中国人”,然后“中国”,再出现一个“国人”,再出现一个“中国”,所以命中不了,有 4 个term要出现,且满足一个大概的位置,当然,可以通过 slop 设置位置的跳跃。
你要是把索引数据改成:“中国人民银行 中国”,就能查出来。
lz8086 - es小司机
赞同来自: AlixMu 、fishyou
然后那么对_all字段查询时默认的分词又是什么呢?
谢谢解惑。@medcl
laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net
赞同来自:
lz8086 - es小司机
赞同来自:
luggie
赞同来自: