index test
的 mapping 定义:
"content": { "type": "text", "analyzer": "ik_smart" }, "title": { "type": "text", "analyzer": "ik_smart" }
测试分词:
http://127.0.0.1:9200/_analyze
提交参数:
{ "text": "中国美国英国", "analyzer": "ik_smart" }
返回
{ "tokens": [ { "token": "中国", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 0 }, { "token": "美国", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 1 }, { "token": "英国", "start_offset": 4, "end_offset": 6, "type": "CN_WORD", "position": 2 } ] }
_search 测试一下索引 test
get body
{ "size": 20, "query": { "match": { "content": "广州人" } } }
返回:
{ "took": 0, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 1, "max_score": 0.84268904, "hits": [ { "_index": "dcc-speechcrafts", "_type": "dcc-speechcraft", "_id": "AXIyjmXuVhRXxkRgwNlT", "_score": 0.84268904, "_source": { "title": "", "content": "qefdygyrfh 广州人" } } ] } }
第二次_search 测试一下
get body
{ "size": 20, "query": { "match": { "content": "广州" } } }
返回:
{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 0, "max_score": null, "hits": [] } }
问题,我那条记录内容包含广州人
这三个字,为什么分别用广州人
和广州
两个词去查询,一次有结果,一次没结果呀?按道理用广州
去查询应该也是返回一样的结果的呀,这什么问题?
elasticsearch 5.6.16
![]() | 1 fancy967 2020-05-20 23:50:03 +08:00 没有研究过 ik_smart 这个 analyzer,不过把广州人、qefdygyrfh 广州人和广州这个三个词放进_analyze 测试一下看返回的 token 能不能匹配上吗不就知道原因了吗 |
![]() | 2 misaka19000 2020-05-20 23:53:06 +08:00 是不是人匹配了但是广州没匹配 |
![]() | 3 CoolSpring 2020-05-21 08:58:14 +08:00 ![]() https://github.com/medcl/elasticsearch-analysis-ik 引用一下 “ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query ; ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。” 这里的问题应该是 ik_smart 在生成索引时只分出了“广州人”一个词,而根据倒排索引的原理用“广州”就搜不到了。 网络上有一些文章的建议是,索引时用 ik_max_word,搜索时用 ik_smart 。(不过也有其他的坑例如 https://github.com/medcl/elasticsearch-analysis-ik/issues/584 ) |
4 dyllen OP @misaka19000 我用_analyze 测试了 ik_smart 分词,广州和广州人不会再分,就一个词 |
5 dyllen OP @CoolSpring 听你这样一说,我好像有点明白了,先去试试先。 |