2014-03-07 141 views
6

我無法在嵌套文檔中組合term,must_not查詢。ElasticSearch中的術語,嵌套文檔和must_not查詢不兼容?

意識例子可以在這裏找到:http://sense.qbox.io/gist/be436a1ffa01e4630a964f48b2d5b3a1ef5fa176

這裏我映射:

{ 
    "mappings": { 
     "docs" : { 
      "properties": { 
       "tags" : { 
        "type": "nested", 
        "properties" : { 
         "type": { 
          "type": "string", 
          "index": "not_analyzed" 
         } 
        } 
       }, 
       "label" : { 
        "type": "string" 
       } 
      } 
     } 
    } 
} 

在此指數兩個文件:

{ 
    "tags" : [ 
     {"type" : "POST"}, 
     {"type" : "DELETE"} 
    ], 
    "label" : "item 1" 
}, 
{ 
    "tags" : [ 
     {"type" : "POST"} 
    ], 
    "label" : "item 2" 
} 

當我詢問該指數是這樣的:

{ 
    "query": { 
    "nested": { 
     "path": "tags", 
     "query": { 
     "bool": { 
      "must": { 
      "term": { 
       "tags.type": "DELETE" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

我有一重擊(這是正確的)

當我想不包含標籤「刪除」的文件,該查詢:

{ 
    "query": { 
    "nested": { 
     "path": "tags", 
     "query": { 
     "bool": { 
      "must_not": { 
      "term": { 
       "tags.type": "delete" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

我已經有2次點擊(這是不正確的)。 這個問題看起來非常接近這個(Elasticsearch array must and must_not),但它不是...

你能給我一些線索來解決這個問題嗎?

謝謝

回答

0

這應該可以解決你的問題:http://sense.qbox.io/gist/f4694f542bc76c29624b5b5c9b3ecdee36f7e3ea

兩個最重要的事情:在 「tags.type」

  1. include_in_root。這將告訴ES將標籤類型索引爲"doc.tags.types" : ['DELETE', 'POSTS'],因此您可以在根文檔中訪問這些值「展平」的數組。這意味着您不再需要嵌套查詢(請參閱#2)

  2. 刪除嵌套查詢。

 

{ 
    "mappings": { 
     "docs" : { 
      "properties": { 
       "tags" : { 
        "type": "nested", 
        "properties" : { 
         "type": { 
          "type": "string", 
          "index": "not_analyzed" 
         } 
        }, 
        "include_in_root": true 
       }, 
       "label" : { 
        "type": "string" 
       } 
      } 
     } 
    } 
} 

 

{ 
    "query": { 
     "bool": { 
     "must_not": { 
      "term": { 
       "tags.type": "DELETE" 
      } 
     } 
     } 
    } 
} 
+0

謝謝,它的工作原理。你能解釋你爲什麼這麼做嗎? – user3393203

+0

僅僅因爲它沒有「include_in_root」是不可能的。現在,您可以將所有「tags.type」視爲一個數組,而不是擁有複雜的嵌套過濾器/查詢系統。這樣,你可以說「像給我所有的文檔沒有在標籤類型數組中的'DELETE'」。 有時候很難說出這些東西,但希望這是有道理的! –

+0

它不適合我。這既奇怪又傷心。這可能是因爲我使用'terms'和'integer'? –

9

你原來的查詢將在每個單獨的嵌套的對象搜索和消滅誰不同意這些對象,但如果有一些嵌套的對象左邊,他們同意你的查詢,所以你得到你的結果。這是因爲,嵌套的對象是索引作爲隱藏單獨的文件

原始代碼:

{ 
    "query": { 
    "nested": { 
     "path": "tags", 
     "query": { 
     "bool": { 
      "must_not": { 
      "term": { 
       "tags.type": "delete" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

然後將溶液真的很簡單,你應該把布爾查詢嵌套的文件之外。現在所有文檔都被丟棄,其中嵌套對象的類型爲「DELETE」。正是你想要的!

解決辦法:

{ 
    "query": { 
    "bool": { 
     "must_not": { 
     "nested": { 
      "path": "tags", 
      "query": { 
      "term": { 
       "tags.type": "DELETE" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

注:您的字符串「不分析」,然後搜索「刪除」,而不是「刪除」。如果你想搜索不區分大小寫,請分析你的字符串

+0

如果我這樣做,沒有標籤字段的數據不包含在結果中 –

+0

您確定嗎?你使用哪個Elasticsearch版本? – rvheddeg

+0

ElasticSearch 2.2.1。重新檢查後,很多查詢在我的筆記本電腦上正常工作,但在服務器中正常工作。 Elasticsearch版本可能發揮作用。 –