当前位置: 首页 > 知识库问答 >
问题:

如何使一个bool查询必须在ElasticSearch中的多个字段?

鞠建安
2023-03-14

很抱歉提出这个问题,但ElasticSearch查询可能会令人困惑。。。

目标:创建一个类似谷歌搜索查询的查询。输入的单词越多,得到的匹配结果越少。例如“四川酱”比“木兰四川酱”产生更多的结果。我的索引有一个博客文章类型,它有字段“标题”、“标签”、“类别”。ElasticSearch必须找到与查询中的所有单词相匹配的每个文档。文字可以遍布各个领域。例如,如果一个文档的标题包含“木兰”,它的标签包含“四川”,它的类别包含“酱”,那么这应该是一个匹配,但如果缺少一个单词,就不是了。

我尝试了不同的bool查询,但即使我使用“必须”,结果也包含与所有查询词不匹配的文档。

例如,我尝试:

String queryString = "mulan szechuan sauce";
QueryBuilder titleMatchQuery = QueryBuilders.matchQuery("title", queryString);
QueryBuilder tagsMatchQuery = QueryBuilders.matchQuery("tags", queryString);
QueryBuilder categoryMatchQuery = QueryBuilders.matchQuery("categories", queryString);
QueryBuilder combinedBoolQuery = QueryBuilders.boolQuery()
    .must(titleMatchQuery)
    .must(tagsMatchQuery)
    .must(categoryMatchQuery);

这将编译为:

{
  "bool" : {
    "must" : [ {
      "match" : {
        "title" : {
          "query" : "mulan szechuan sauce",
          "type" : "boolean"
        }
      }
    }, {
      "match" : {
        "tags" : {
          "query" : "mulan szechuan sauce",
          "type" : "boolean"
        }
      }
    }, {
      "match" : {
        "categories" : {
          "query" : "mulan szechuan sauce",
          "type" : "boolean"
        }
      }
    } ]
  }
}

如上所述,这也会产生不包含查询中所有单词的结果:-/

共有1个答案

步博涉
2023-03-14

multi_match代替,你就好了:

String queryString = "mulan szechuan sauce";
QueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(queryString, 
    "title", "tags", "categories");
QueryBuilder combinedBoolQuery = QueryBuilders.boolQuery()
    .must(multiMatchQuery);
 类似资料:
  • 问题内容: 我想使用查询来比较多个字段。我有字段1到4。我想搜索字段1大于字段2并且下面的查询工作正常的数据; 现在,我想搜索哪个字段1大于字段2以及哪个字段3大于字段4的数据。根据Elastic Search:如何编写多语句脚本?和此链接,我只需要用分号分隔每个语句。所以应该是这样的: 但是该查询无效,并返回如下编译错误: ] .value> doc [‘field2’]。value; doc

  • 我想使用查询来比较多个字段。我有字段1到字段4。我想搜索数据,其中字段1大于字段2,下面的查询是完美的工作; 现在,我想搜索哪个字段1大于字段2,哪个字段3大于字段4的数据。根据弹性搜索:如何编写多语句脚本?在这个链接中,我只需要用分号分隔每条语句。所以它应该是这样的: 但该查询不起作用,并返回如下编译错误: {“根本原因”:[{“类型”:“脚本异常”,“原因”:“编译错误”,“脚本堆栈”:[“d

  • 我想要找到一个文件的名称包含'Bob',并有一个位置在'paducah'或'smyrna'。 以下是我现在所拥有的: 我知道问题出在location数组上,因为如果我将它改为一个没有数组的元素,那么查询就可以正常工作。 这是我能找到的最接近的答案。 它没有工作,我收到以下错误: [term]查询格式错误,应为[END_OBJECT],但找到[FIELD_NAME]

  • 我目前正在尝试将一个基于Solr的应用程序迁移到ElasticSearch。 我有这个lucene查询 根据我的理解,这是一个必须子句与布尔OR结合的组合: “获取名称中包含(foo和bar)或信息中包含(foo和bar)的所有文档。之后,根据条件筛选结果state=1,并增强具有图像的文档。” 我一直试图在MUST中使用bool查询,但未能将boolean或转换为MUST子句。以下是我的资料:

  • 问题内容: 我目前正在尝试将基于Solr的应用程序迁移到Elasticsearch。 我有这个lucene查询 据我了解,这是MUST子句与布尔OR的组合: “获取所有包含(名称中包含foo AND条)或(信息中包含foo AND条)的所有文档。在此之后,按条件state = 1过滤结果,并增强具有图像的文档。” 我一直在尝试将布尔查询与MUST一起使用,但是我无法将布尔OR放入must子句中。这

  • 问题内容: 我的愿望是搜索存在field_a而不存在fields_b的文档。有没有一种方法可以使用Kibana中的Lucene查询语法(Kibana的Discover部分中的Search字段)进行此操作。 我尝试使用 __missing_:field_b_ 失败( __exists_可行_ )。 我发现了这一点,但并没有太大帮助: 问题答案: 对于lucene搜索语法: 对于elasticsear