Elasticsearch中的多个OR过滤器

时间:2015-11-11 08:15:18

标签: elasticsearch

您好我在Elasticsearch中确定多个OR的以下查询的正确性时遇到问题。我想选择所有唯一数据(不计数,但选择所有行)

我在弹性查询中的最佳尝试是

GET mystash/_search
{
    "aggs": {
        "uniques":{
             "filter":
            {
                "or":
                        [
                            { "term": { "url.raw" : "/a.json" } },
                            { "term": { "url.raw" : "/b.json" } },
                            { "term": { "url.raw" : "/c.json"} },
                            { "term": { "url.raw" : "/d.json"} }
                        ]
            },
            "aggs": {
                "unique" :{
                    "terms" :{
                        "field" : "id.raw",
                        "size" : 0
                    }
                }
            }
        }
    }
}

等效的SQL将是

SELECT DISTINCT id
FROM json_record
WHERE 
    json_record.url = 'a.json' OR
    json_record.url = 'b.json' OR
    json_record.url = 'c.json' OR
    json_record.url = 'd.json'

我想知道上面的查询是否正确,因为报告生成需要数据。

1 个答案:

答案 0 :(得分:1)

一些评论:

  • 您应该使用查询过滤器而不是聚合过滤器。您的查询加载所有文档。
  • 您可以使用单个术语过滤器
  • 替换您的或术语过滤器
  • 您可以在查询的根目录中使用size = 0来仅获取agg结果而不是搜索结果

示例代码:

{"size":0,
  "query" :{"filtered":{"filter":{"terms":{"url":["a", "b", "c"]}}}}, 
   "aggs" :{"unique":{"term":{"field":"id", "size" :0}}}
}