V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dyllen
V2EX  ›  Elasticsearch

elasticsearch IK 分词怎么无效呀?

  •  
  •   dyllen · 2020-05-20 23:06:01 +08:00 · 3112 次点击
    这是一个创建于 1637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    6 条回复    2020-05-21 10:14:00 +08:00
    fancy967
        1
    fancy967  
       2020-05-20 23:50:03 +08:00
    没有研究过 ik_smart 这个 analyzer,不过把广州人、qefdygyrfh 广州人和广州这个三个词放进_analyze 测试一下看返回的 token 能不能匹配上吗不就知道原因了吗
    misaka19000
        2
    misaka19000  
       2020-05-20 23:53:06 +08:00
    是不是人匹配了但是广州没匹配
    CoolSpring
        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
    dyllen
        4
    dyllen  
    OP
       2020-05-21 09:52:25 +08:00
    @misaka19000 我用_analyze 测试了 ik_smart 分词,广州和广州人不会再分,就一个词
    dyllen
        5
    dyllen  
    OP
       2020-05-21 09:53:22 +08:00
    @CoolSpring 听你这样一说,我好像有点明白了,先去试试先。
    dyllen
        6
    dyllen  
    OP
       2020-05-21 10:14:00 +08:00
    @fancy967
    @dyllen

    明白了,还是不太了解 elasticsearch 导致的,设置成了索引时用 ik_max_word,搜索时用 ik_smart 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1094 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:30 · PVG 03:30 · LAX 11:30 · JFK 14:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.