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 1
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 听你这样一说,我好像有点明白了,先去试试先。
|