身安不如心安,屋宽不如心宽 。

Elasticsearch 分词搜索 - 精确查找

Elasticsearch | 作者 ccm | 发布于2018年03月21日 | 阅读数:13773

怎么做到分词后更精确的搜索?
比如用户输入: 苹果手机
假如分词器(IK)分为: 苹果 手机
我想搜索文档中既包含苹果又包含手机的,而不是把包含苹果和包含手机的都搜索出来。
这个应该怎么做,感谢了。
已邀请:

kennywu76 - Wood

赞同来自: laoyang360 lz8086 liupan182

我觉得1楼和2楼给的方案都可行, 基于关键词的分词和匹配也只能做到这个精准度了。
 
但是我感觉提问者其实想表达的是能否做到语义搜索,也就是说,当用户输入“苹果手机”的时候,人是可以理解其中的语义的,人脑可以将其译成 :


"brand:苹果 AND category:手机"


所以要做到这种智能程度的搜索匹配,只能借助语义分析了。
 
刚好月初去美国参加2018 Elastic{On},看到其中一个国外电商网站实现这类搜索的分享,借助了一个叫做Twiggle的产品,有兴趣的可以参考研究一下:

IMG_20180228_140042.jpg


IMG_20180228_140127.jpg

 

rochy - rochy_he

赞同来自: junjianw

可以尝试使用Dis Max Query将短语搜索和普通搜索组合起来。
{
  "dis_max" : {
    "queries" : [ {
      "function_score" : {
        "query" : {
          "match" : {
            "字段" : {
              "query" : "苹果手机",
              "type" : "phrase"
            }
          }
        },
        "functions" : [ {
          "weight" : 10.0
        } ]
      }
    }, {
      "match" : {
        "字段" : {
          "query" : "苹果手机",
          "type" : "boolean"
        }
      }
    } ]
  }
}

code4j - coder github: https://github.com/rpgmakervx

赞同来自: sgrcr

要么 search_analyzer 分词采用ik_smart,词库中加入苹果手机这个词项,使搜索阶段能够使用最大化term。要么MatchQuery 使用operator为 AND 表示搜索的每个term都命中。其实就类似 not_analyze了。

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自:

一楼已经很好的解决了这个问题。
dismax的核心就是解决:
1个字段包含两个关键词比2个字段分别包含一个关键词得分要高的问题。

要回复问题请先登录注册