我有一个文件(我知道在索引中)和一个查询。有没有办法知道文档是否满足查询,而不实际查询索引并查看结果。
例如,我想知道文件是否
{ "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 )
这是一个简单的案例,但我需要一些任意查询。
答案 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
变量是否为真。