是否可以在ElasticSearch查询中保留连接嵌套文档?

时间:2013-08-13 01:09:30

标签: lucene elasticsearch

上下文

假设您有一组已定义nested mapping的文档。还假设某些文档具有嵌套文档而某些文档没有:

文件1

{
  "id":1,
  "nested":[
    {
      "x":1
    }
  ]
}

文件2

{
  "id":2,
  "nested":[
    {
      "x":2
    }
  ]
}

文件3

{
  "id":3
}

问题

是否有办法执行以下SQL查询的等效操作:

SELECT
    r.id,
    COUNT(*)
FROM
    root r
    LEFT JOIN
    nested n
        ON parent(n) = r
WHERE
    n.x = 1 /* nested condition */
GROUP BY
    r.id

使用ElasticSearch的查询DSL非常接近的是:

curl -XGET http://localhost:9200/nested/type/_search?pretty -d'
{
   "fields":["id"],
   "query":{
       "nested":{
          "query":{
              "constant_score":{
                 "query":{
                    "term":{"x":1}
                 }
              },
              "boost":1.0
           }
        },
        "path":"nested",
        "score_mode":"total"
      }
   }
}'

但是,由于nested queriesnested filters的语义要求文档具有at least one nested document,因此文档3 将被过滤掉(即“内部 - 加入“语义学”。

如果文档没有嵌套文档,是否有解决方法/替代方法来阻止文档被排除?


的应用

上面说明嵌套文档的条件。虽然在这个例子中很简单,但可以很容易地想象出由于组合爆炸而无法预先预先计算基于多个动态条件的基于分数的聚合的情况。

上述查询中的主要值是,它包含得分值为“0”的结果,并保留全局文档分数排序,因此无法使用facets或即将到来的{{3}计算}。


资源

0 个答案:

没有答案