确定文档是否满足ElasticSearch中的查询(不实际执行查询)

时间:2016-09-19 21:05:29

标签: python elasticsearch elasticsearch-2.0

我有一个文件(我知道在索引中)和一个查询。有没有办法知道文档是否满足查询,而不实际查询索引并查看结果。

例如,我想知道文件是否

{ "price" : 30, "productID" : "1937" }

满足查询

{'query': {'bool': {
        'should': [{'bool': {
            'must': [{'term': {'price': 30}}, {'term': {'productID': '1937'}}]}},
            {'term': {'productID': '9947'}}]
    }}}

基本上是

productID      = 9947
OR (productID = 1937 AND price = 30 )

这是一个简单的案例,但我需要一些任意查询。

2 个答案:

答案 0 :(得分:1)

不幸的是,我认为没有直接的方法可以做到这一点。你可以:

A)发出查询,使用ids查询按文档ID过滤,以避免查询所有文档:

{
    "ids" : {
        "type" : "my_type",
        "values" : ["1", "4", "100"]
    }
}

示例来自:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-ids-query.html

B)使用ES的过滤器索引查询,然后按文档查询

索引查询:

curl -XPUT 'localhost:9200/my-index/.percolator/1' -d '{
    "query" : {
        "match" : {
            "message" : "bonsai tree"
        }
    }
}'

按文件查询:

curl -XGET 'localhost:9200/my-index/my-type/_percolate' -d '{
    "doc" : {
        "message" : "A new bonsai tree in the office"
    }
}'

响应:

{
    "took" : 19,
    "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
    },
    "total" : 1,
    "matches" : [ 
        {
          "_index" : "my-index",
          "_id" : "1"
        }
    ]
}

示例来自:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html

如果回复包含您的查询ID,则您的查询将应用于该文档。这种方法的优点是你可以为不同的文档多次运行它。

答案 1 :(得分:1)

如果您知道该文档的ID,则可以使用"解释" API。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html

假设您的文档ID为1234abc,则可以执行以下操作

curl -XGET 'your_es_server:9200/your_index/your_mapping/1234abc/_explain' -d '{'query': {'bool': {
    'should': [{'bool': {
        'must': [{'term': {'price': 30}}, {'term': {'productID': '1937'}}]}},
        {'term': {'productID': '9947'}}]
}}}'

这应该会返回这样的东西。

    {
  "_index": "your_index",
  "_type": "your_mapping",
  "_id": "1234abc",
  "matched": true,
  "explanation": {
    "value": 0.06100826,
    "description": "sum of:",
    "details": [.........
....
...
...

您只需检查上述回复中的matched变量是否为真。