es中一个query中的多个搜索条件,并根据条件区分items

multiple search conditions in one query in es and distinguish the items according to the conditions

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

但是我需要根据条件区分退货商品

目前我是通过函数score query实现的,具体是:每个条件都分配一个score,我可以根据这些score来区分结果。

但是,性能不是很好。另外现在我们需要获取每个条件的文档计数。

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

谢谢!

更新:

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"}}]
            }
          }
        }
      }
    ]
  }
}}'

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

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

这将为每个命中 return 一个名为 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