es库的全文检索字段怎么搜索一个不分开的词组?

全文搜索的字段,如果想要查询一个用空格分开的词组,
例如:‘Gritty Hope’,使用什么样的es库查询语句,能达到查询出来的结果必须都包含这个词组,就是说,只包含‘Gritty’或‘Hope’的数据查询不出来。这两个单词都有的,也必须是‘Gritty Hope’这样的才能查询到。应该怎么写这个查询语句啊?

查询关键词:‘Gritty Hope’,
{
"id":'001',
"title": "Gritty Hope: now what could possibly go right?"
},
{
"id":'002',
"title": "gritty hope: now what could possibly go right?"
}
这两条可以查询出来,
{
"id":'002',
"title": "The Batman Trailer: Gritty, Haunting, & Fu*king Epic"
},
{
"id":'003',
"title": "Raymond James Keeps a Hold Rating on Hope Bancorp (HOPE)"
}
这两条查询不出来。

阅读 5.8k
2 个回答

可以用这个,match查询。

GET your_index/_search
{
  "query": {
    "match": {
      "title": {
        "query": "Gritty Hope",
        "operator": "AND"
      }
    }
  }
}

我前两天也弄过,不过是标签匹配的问题。本人也是新手,刚刚知道一点,给你说一下思路。

  1. 首先es会对所有的文档 text 类型进行分词的,英文默认是 空格区分,每一个单词就是底层的一个索引
  2. 不同的单词根据你当前的索引,他的权重是不一样的。
  3. 你这个需求换一种描述(可能不准确,但是对于我的标签来说很适合)可以是这样的,我想查阅的这一句话,匹配到了几个分词后的内容,就是我不想要他的权重分,我只是想知道次数,或者每一个单词的权重为 1,最后相加起来
  4. 查询就可以这样做:使用bool查询,把你要查询的单词通过空格分开,对每一个单词组合成 bool 下面的 should 查询,filter查询通过constant_score把权重设为1.大概按照下面
  5. 最后筛选权重等于单词分割后的大小,比如 大于2
{
  "query": {
    "bool": {
      "should": [
        {"constant_score": {
          "filter": {"term": {
            "tags": "aaaa" // 这个地方就是需要将单词空格区分开,每一个都这么组合
          }
          }
        }},
        {"constant_score": {
          "filter": {"term": {
            "tags": "bbb" // 这个地方就是需要将单词空格区分开,每一个都这么组合
          }
          }
        }}
      ]
    }
  }
}

这个查询比如索引有数据:1aaa bbb 2aaa ccc 3bbb ccc
那么结果就是:1的得分为2, 2,3的得分为1

我也是刚知道es,我的需求可以这么做。有知道更好的可以留言:核心的诉求就是:我不要默认的评分,而是想知道他匹配成功了几次

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进