2015-11-05 62 views
0

我在elasticsearch中有一些文檔有一個鍵值對列表。這裏有些例子。minimum_number_should_match與嵌套必須bool

document 1: 
{ 
    data: [ 
     { 
      key: key1, 
      value: value1 
     }, 
     { 
      key: key1, 
      value: value2 
     }, 
    ] 
} 

document 2: 
{ 
    data: [ 
     { 
      key: key2, 
      value: blah 
     }, 
     { 
      key: key1, 
      value: value2 
     }, 
    ] 
} 

document 3: 
{ 
    data: [ 
     { 
      key: key1, 
      value: value3 
     }, 
     { 
      key: key1, 
      value: value2 
     }, 
     { 
      key: key1, 
      value: somevalue 
     } 
    ] 
} 

document 4: 
{ 
    data: [ 
     { 
      key: key3, 
      value: blah 
     } 
    ] 
} 

現在我想有值[value1, value2, value3]至少2與關鍵key1所有文件。 所以從這個例子中,我需要文件1和3但是不是2或4

到目前爲止,我的查詢看起來是這樣的:

"query": { 
    "nested": { 
     "path": "data", 
     "query": { 
      "bool": { 
       "should": [ 
        { 
         "bool": { 
          "must": [ 
           { 
            "term": { 
             "key": key1 
            } 
           }, 
           { 
            "term": { 
             "value": { 
              "value": "value1", 
             } 
            } 
           } 
          ] 
         } 
        }, 
        { 
         "bool": { 
          "must": [ 
           { 
            "term": { 
             "key": key1 
            } 
           }, 
           { 
            "term": { 
             "value": { 
              "value": "value2", 
             } 
            } 
           } 
          ] 
         } 
        }, 
        { 
         "bool": { 
          "must": [ 
           { 
            "term": { 
             "key": key1 
            } 
           }, 
           { 
            "term": { 
             "value": { 
              "value": "value3", 
             } 
            } 
           } 
          ] 
         } 
        } 
       ], 
       "minimum_number_should_match": 2 
      } 
     } 
    } 
} 

但它完全不返回任何比賽。 據我所知,minimum_number_should_match只是確保文件只有在至少匹配bool query中給定的最小should出現時纔會被返回。

但好像我不完全瞭解它是如何工作的。 我究竟如何得到minimum_number_should_match以使用嵌套的bool查詢,還是有另一種方法來執行此操作?

回答

0

問題是,嵌套查詢進入每個data對象並查看單個密鑰,值爲對。 因此,它不可能匹配多個值(每個鍵,值對只有一個值)。

我不得不每個值匹配拆分成它自己的嵌套查詢:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "nested": { 
      "path": "data", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "key": "key1" 
        } 
        }, 
        { 
        "term": { 
         "value": { 
         "value": "value1" 
         } 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "nested": { 
      "path": "data", 
      "query": { 
       "bool": { 
       "must": [ 
        { 
        "term": { 
         "key": "key1" 
        } 
        }, 
        { 
        "term": { 
         "value": { 
         "value": "value2" 
         } 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "nested": { 
      "path": "data", 
      "bool": { 
       "must": [ 
       { 
        "term": { 
        "key": "key1" 
        } 
       }, 
       { 
        "term": { 
        "value": { 
         "value": "value3" 
        } 
        } 
       } 
       ] 
      } 
      } 
     } 
     ], 
     "minimum_should_match": 2 
    } 
    } 
} 

這意味着該查詢可以匹配的data領域的倍數,如果在2應該查詢匹配,則文檔匹配整個查詢。

0

此查詢應該適合您。我懷疑它會出錯的唯一地方是使用關鍵字「值」作爲一個字段。你可以試試。以下是查詢:

{ 
    "query": { 
    "nested": { 
     "path": "data", 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "key": { 
        "value": "key1" 
       } 
       } 
      } 
      ],"should": [ 
      { 
       "term": { 
       "value": { 
        "value": "value1" 
       } 
       } 
      },{ 
       "term": { 
       "value": { 
        "value": "value2" 
       } 
       } 
      },{ 
       "term": { 
       "value": { 
        "value": "value3" 
       } 
       } 
      },{ 
       "term": { 
       "value": { 
        "value": "value4" 
       } 
       } 
      } 
      ],"minimum_number_should_match": 2 
     } 
     } 
    } 
    } 
} 

至於如何minimum_number_should_match工作,你是對的。它試圖匹配在bool查詢的「應該」部分之下的最小可能查詢。

+0

我實際上並沒有字段「value」這個詞。這只是一個顯示我的文檔結構的例子。我認爲這可能與'minimum_number_should_match'對嵌套布爾的工作方式有所不同? –

相關問題