我有一个弹性搜索文档,其来源如下:
{
"_source": {
"id": {
"value": 1
},
"make": "Ford",
"model": "Mustang",
"color": "Red"
}
}
我想写一个与下面的短语匹配的查询:
但不会匹配短语:
在这种情况下应该使用哪种类型的查询?
答案 0 :(得分:0)
您可以使用布尔值:
搜索任何字段:
curl -XPOST 'http://localhost:9200/cars_index/car_type/_search' -d '{"query":{"bool":{"must":[{"query_string":{"query":"Ford"}}, {"query_string":{"query":"mustang"}}]}}}'
搜索特定字段:
curl -XPOST 'http://localhost:9200/cars_index/car_type/_search' -d '{"query":{"bool":{"must":[{"query_string":{"query":"make:Ford"}}, {"query_string":{"query":"model:mustang"}}]}}}'
您可以结合使用musts,shoulds,must_not等,并对字段进行否定:
{"query":"-make:Ford"} (not make == Ford)
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html
答案 1 :(得分:0)
我成功地使用了它:
BoolQueryBuilder q = boolQuery();
for (String word : phrase.split("\\s+")) {
q.must(boolQuery()
.should(matchQuery("make", word))
.should(matchQuery("model", word))
.minimumNumberShouldMatch(1)
);
}
但是我正在拆分搜索短语并使用它的词来构建查询。
有更好的方法吗?
答案 2 :(得分:0)
我认为,首先您只需要查询 make 和模型字段。接下来,您需要为传递的查询字符串设置适当的分析器。在这种情况下,whitespace analyzer更有意义。所以这是您可以使用的查询:
query_string: {
query: {
fields: ['make', 'model']
analyzer: 'whitespace'
query: 'Ford Mustang'
}
}