2014-10-01 70 views
0

我试图运行对elasticsearch一个查询,就会发现文件凡符合下列条件之一适用:排除空数组领域 - 但包括文档丢失的领域 - 在elasticsearch

  • 文件缺少给定场(tags)OR
  • 的文档具有价值foo作为tags数组的元素

的问题是,我当前的查询将返回有一个的文件其中值为空数组的字段。据推测,这是因为elasticsearch将空阵列视为与没有该字段相同的事物。以下是我正在运行的是返回不好的结果全查询:

{ 
    "from": 0, 
    "query": { 
     "filtered": { 
      "filter": { 
       "bool": { 
        "must": [ 
         { 
          "exists": { 
           "field": "_rankings.public" 
          } 
         }, 
         { 
          "or": [ 
           { 
            "missing": { 
             "existence": true, 
             "field": "tags", 
             "null_value": false 
            } 
           }, 
           { 
            "terms": { 
             "execution": "or", 
             "tags": [ 
              "foo" 
             ] 
            } 
           } 
          ] 
         } 
        ] 
       } 
      }, 
      "query": { 
       "match_all": {} 
      } 
     } 
    }, 
    "size": 10000, 
    "sort": [ 
     { 
      "_rankings.public": { 
       "ignore_unmapped": true, 
       "order": "asc" 
      } 
     } 
    ] 
} 

回答

1

我不认为你可以做到这一点那么容易“乱用”的你已经提到的原因是:有没有空数组和字段(对应于该数组)之间的差异,其中没有值。

您唯一的选择可能是对该“tags”字段使用“null_value”,如果您对进入文档的数据有任何控制权,则将“[]”数组视为“[” _your_null_value_of_choice_“]”。并在您的查询中将"null_value": false更改为true

+0

为什么不设置'null_value:false'会排除所有包含空值的空值的文档?它似乎应该来自缺少的过滤器文档:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-missing-filter.html – ysimonson 2014-10-01 21:22:25

+0

“null_value”属性的“缺少”过滤器是告诉ES考虑为字段设置的“null_value”字段(通过映射)被视为缺失字段。在我给出的例子中,如果你把'“标签”:[“_your_null_value_of_choice _”]并设置为''null_value“:true'将认为该文档中有一个空值的数组。如果你把''null_value':false',这个文件将不被考虑,因为ES不知道你放在那里的值是否为null。因此,“null_value”属性不用于您认为应该使用的属性,它与为字段设置的“null_value”关联。 – 2014-10-02 11:03:37