2017-11-03 153 views
0

我是ES查詢的新手。我試圖根據可以匹配任何值的密鑰而不是一個特定值來獲得結果。例如:密鑰foo可以是bar, baz之一。我試過這與數組,並應該但結束了錯誤的結果或異常。什麼是ES中OR情況的正確語法。我正在使用ES 5.6。*彈性搜索 - 搜索查詢以匹配特定鍵的任何一個值

+0

您是否解決了此問題? – Miek

回答

0

有很多方法可以做到這一點。

取決於您所使用的分析儀,你可以非常不喜歡這樣寫道:

GET /test/_search 
{ 
    "query": { 
    "match": { 
     "foo": "bar, baz" 
    } 
    } 
} 

演示什麼分析,以(默認爲5.6)

GET /test/_analyze 
{ 
    "field": "foo", 
    "text": [ 
    "bar, baz" 
    ] 
} 

1.4.3這些令牌:

{ 
    "tokens": [ 
    { 
     "token": "bar", 
     "start_offset": 0, 
     "end_offset": 3, 
     "type": "<ALPHANUM>", 
     "position": 0 
    }, 
    { 
     "token": "baz", 
     "start_offset": 5, 
     "end_offset": 8, 
     "type": "<ALPHANUM>", 
     "position": 1 
    } 
    ] 
} 

在上面的例子中,使用「bar,baz」或「bar baz」將等於搜索「bar」和「baz」。

您還可以將它們分組在查詢中是這樣的:

GET /test/_search 
{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "match": { 
      "foo": "bar" 
      } 
     }, 
     { 
      "match": { 
      "foo": "baz" 
      } 
     } 
     ] 
    } 
    } 
} 

上述會給你一個得分的查詢,需要兩個酒吧和巴茲在查詢文檔的匹配。

您也可以將「must」替換爲「filter」,「should」或「must_not」。 「過濾器」將不計分,應該會從與運算的查詢,可切換到或運算查詢(你也可以指定或最低金額),或使用「must_not」

Bool query

反向查詢除此之外還有更多的方法,但這應該讓你開始正確的軌道。

A「應該」的例子要求只投中兩個術語之一,因爲這是你原來的問題:

GET /test/_search 
{ 
    "query": { 
    "bool": { 
     "minimum_should_match": 1, 
     "should": [ 
     { 
      "match": { 
      "foo": "bar" 
      } 
     }, 
     { 
      "match": { 
      "foo": "baz" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

好吧讓我更清楚我的問題。我需要總共25個結果。如果ES中總共有50條消息。而20有「價值」「富」的價值,那麼它應該採取休息5消息有價值「巴茲」。 –

+0

我提供的底部片段將爲您提供任何具有「酒吧」或「baz」的項目的結果,但不限於第一個X數量的一個,然後是其他的剩餘部分,如果我正確解釋您的評論。 – Miek

0

您需要使用bool條件與shouldmatchmatch_phrase合併(你會喜歡match_phrase只要您確切知道您要搜索的內容)

GET local-signaler/_search 
{ 
    "query": { 
    "bool" : { 
     "should" : [ 
     { "match_phrase" : { "foo" : "bar" } }, 
     { "match_phrase" : { "foo" : "baz" } } 
     ], 
     "minimum_should_match" : 1 
    } 
    } 
}