0

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

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

我想编写一个匹配以下短语的查询:

  • 福特
  • 福特野马
  • 野马
  • 野马福特
  • 福特野马

但不会匹配以下短语:

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

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

4

3 回答 3

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

于 2013-10-30T22:24:51.640 回答
0

我认为,首先您只需要查询品牌型号字段。接下来,您需要为您传递的查询字符串设置适当的分析器。在这种情况下,空白分析器更有意义。所以这是您可以使用的查询:

query_string: {
  query: {
    fields: ['make', 'model']
    analyzer: 'whitespace'
    query: 'Ford Mustang'   
  }
}
于 2013-10-31T12:35:34.657 回答
0

我设法使它与:

BoolQueryBuilder q = boolQuery();
for (String word : phrase.split("\\s+")) {
    q.must(boolQuery()
        .should(matchQuery("make", word))
        .should(matchQuery("model", word))
        .minimumNumberShouldMatch(1)
    );
}

但我正在拆分搜索短语并使用它的词来构建查询。

有更好的方法吗?

于 2013-10-31T12:01:26.660 回答