dangyuluo

Elasticsearch+ik-analyzer 下,如何实现单字搜索?如“珀”=>“琥珀”

  •  
  •   dangyuluo · Sep 5, 2016 · 10475 views
    This topic created in 3575 days ago, the information mentioned may be changed or developed.

    复现很简单,在某个索引的某个字段中创建一个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 分词器会拆分每个汉字。

    不知道各位都怎么解决这个问题,谢谢。

    5 replies    2016-09-06 21:03:03 +08:00
    xujif
        1
    xujif  
       Sep 5, 2016
    type 用 phrase 不然就自己添加词库字典
    marffin
        2
    marffin  
       Sep 5, 2016
    同时加一个 1gram 的 analyzer 就好
    lyroge
        3
    lyroge  
       Sep 5, 2016
    添加一列,用 standard 分析器?
    Suclogger
        4
    Suclogger  
       Sep 5, 2016
    建立索引需要细粒度,检索需要粗粒度

    意味着

    index_analyzer 用 ik_max_word
    query_analyzer 用 ik_smart
    woyaojizhu8
        5
    woyaojizhu8  
       Sep 6, 2016
    微软全系的搜索也有这个问题,比如 windows 搜索 , onenote 搜索 , sql server 搜索
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2588 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 12:49 · PVG 20:49 · LAX 05:49 · JFK 08:49
    ♥ Do have faith in what you're doing.