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

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

  •  
  •   dangyuluo · 2016-09-05 10:14:41 +08:00 · 7061 次点击
    这是一个创建于 3005 天前的主题,其中的信息可能已经有所发展或是发生改变。

    复现很简单,在某个索引的某个字段中创建一个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 条回复    2016-09-06 21:03:03 +08:00
    xujif
        1
    xujif  
       2016-09-05 11:26:18 +08:00
    type 用 phrase 不然就自己添加词库字典
    marffin
        2
    marffin  
       2016-09-05 11:59:01 +08:00
    同时加一个 1gram 的 analyzer 就好
    lyroge
        3
    lyroge  
       2016-09-05 12:03:59 +08:00
    添加一列,用 standard 分析器?
    Suclogger
        4
    Suclogger  
       2016-09-05 12:35:55 +08:00
    建立索引需要细粒度,检索需要粗粒度

    意味着

    index_analyzer 用 ik_max_word
    query_analyzer 用 ik_smart
    woyaojizhu8
        5
    woyaojizhu8  
       2016-09-06 21:03:03 +08:00
    微软全系的搜索也有这个问题,比如 windows 搜索 , onenote 搜索 , sql server 搜索
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4976 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:57 · PVG 11:57 · LAX 19:57 · JFK 22:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.