2015-06-12 22 views
2

我們如何在彈性搜索中結合AND/OR查詢。例如,以下是我們的文件And +或使用彈性搜索REST API查詢

{"title": "MI2", "brand": "Xiomi","operatingSystem": "Android"}, 
{"title": "Nexus","brand": "Google","operatingSystem": "Android"}, 
{"title": "Samsung Note","brand": "Samsung","operatingSystem": "Android"}, 
{"title": "Samsung Galaxy","brand": "Samsung","operatingSystem": "Android"} 

現在我們如何從Samsung或Xiomi查詢Android手機。

(OperatingSystem的== 「機器人」)AND(品牌== 「三星」 或品牌== 「Xiomi」)

回答

1

和/或邏輯可以作爲一個過濾器被應用。

elasticsearch中的篩選器將在執行查詢之前進行評估,因此如果您需要將此邏輯應用於也包含字符串查詢的調用,它仍然有效並且適用。

由於您的OR代碼正在評估相同的屬性,在這種情況下,您可以在AND語句中使用條款過濾器。您的ES呼叫將如下所示:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "query": "your search string" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "term": { "operatingSystem": "Android" } 
      }, 
      { 
      "terms": { "brand": ["Samsung", "Xiomi"] } 
      } 
     ] 
     } 
    } 
    } 
} 

您可能會看到有關條款here的文檔。默認值是一個布爾或,返回符合提供的任何值的文檔。

要根據你的問題展開,如果你想第二部分來評估或聲明的不同特性,例如使用的標題和品牌你的數據結構,它看起來如下:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "query_string": { 
      "query": "your search string" 
     } 
     }, 
     "filter": { 
     "and": [ 
      { 
      "term": { "operatingSystem": "Android" } 
      }, 
      { 
      "or": [ 
       { 
       "term": { "brand": "Xiomi" } 
       }, 
       { 
       "term": { "title": "Samsung Note" } 
       } 
      ] 
      } 
     ] 
     } 
    } 
    } 
} 

後者相當於:

(operatingSystem == "Android") AND (title == "Samsung Note" OR brand == "Xiomi")