Elasticsearch - 应该使用哪种类型的查询

时间:2013-10-30 18:35:02

标签: elasticsearch

我有一个弹性搜索文档,其来源如下:

{
    "_source": {
        "id": {
            "value": 1
        },
        "make": "Ford",
        "model": "Mustang",
        "color": "Red"
    }
}

我想写一个与下面的短语匹配的查询:

  • 福特
  • Ford Mustang
  • 野马
  • Mustang Ford
  • 福特野马

但不会匹配短语:

  • 福特奥迪野马
  • 奥迪野马

在这种情况下应该使用哪种类型的查询?

3 个答案:

答案 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'   
  }
}