很抱歉这个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"
}
}
} ]
}
}
如上所述,这也会产生不包含查询中所有单词的结果: - /
答案 0 :(得分:2)
使用multi_match
而不是你很好:
String queryString = "mulan szechuan sauce";
QueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(queryString,
"title", "tags", "categories");
QueryBuilder combinedBoolQuery = QueryBuilders.boolQuery()
.must(multiMatchQuery);