如何使用ElasticSearch中的多个字段进行bool查询?

时间:2017-05-22 14:05:11

标签: elasticsearch

很抱歉这个noob问题,但ElasticSearch查询可能会令人困惑......

目标:创建一个与Google搜索查询类似的查询。输入的单词越多,得到的匹配结果越少。例如" szechuan sauce"产生的结果比'mulan szechuan sauce"更多。 我的索引有一个博客文章类型,其中包含字段" title"," tags"," categories"。 ElasticSearch必须找到与查询中的所有单词匹配的每个文档。这些词可以分布在所有领域。例如,如果文档的标题包含" mulan",则其标签包含" szechuan"它的类别包含" sauce",那么这应该是一个匹配,但如果缺少一个单词则不行。

我尝试了不同的bool查询,但即使我使用" must"然后结果包含与所有查询词不匹配的文档。

例如我试过:

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 个答案:

答案 0 :(得分:2)

使用multi_match而不是你很好:

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