在一个查询中的多个搜索条件,并根据条件区分项目

时间:2015-01-06 06:18:07

标签: elasticsearch

对于一种情况,我需要在一个查询中放置多个搜索条件,以减少我们需要的查询数量。

但是,我需要根据条件区分退货项目。

目前我通过使用功能评分查询实现了这一目标,具体而言:每个条件都分配了一个分数,我可以根据这些分数区分结果。

然而,表现不是那么好。此外,我们现在需要获取每个条件的文档计数。

那么有什么方法可以做到吗?我正在考虑使用聚合,但不确定我是否可以这样做。

谢谢!

更新:

curl -X GET 'localhost:9200/locations/_search?fields=_id&from=0&size=1000&pretty' -d '{
"query":{
  "bool":{
    "should":[
      {
        "filtered":{
          "filter":{
            "bool":{
              "must":[{"term":{"city":"new york"}},{"term":{"state":"ny"}}]
            }
          }
        }
      },
      {
        "filtered":{
          "filter":{
            "bool":{
              "must":[{"term":{"city":"los angeles"}},{"term":{"state":"ca"}}]
            }
          }
        }
      }
    ]
  }
}}'

1 个答案:

答案 0 :(得分:0)

回答问题的第一部分,名称查询是最好的。 例如:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field1": {
              "query": "qbox",
              "_name": "firstQuery"
            }
          }
        },
        {
          "match": {
            "field2": {
              "query": "hosted Elasticsearch",
              "_name": "secondQuery"
            }
          }
        }
      ]
    }
  }
}

这将为每个匹配返回一个名为matched_queries的附加字段,该字段将包含与该文档匹配的查询的信息。 您可以在名称查询here

上找到更多信息

但是这个信息不能用于汇总。 因此,您需要以单独的方式处理问题的第二部分。 每个查询类型的过滤器聚合将是这里的想法解决方案。 例如:

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "text": {
              "query": "qbox",
              "_name": "firstQuery"
            }
          }
        },
        {
          "match": {
            "source": {
              "query": "elasticsearch",
              "_name": "secondQuery"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "firstQuery": {
      "filter": {
        "term": {
          "text": "qbox"
        }
      }
    },
    "secondQuery": {
      "filter": {
        "term": {
          "source": "elasticsearch"
        }
      }
    }
  }
}

您可以在过滤器聚合here

上找到更多信息