2014-10-01 102 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