2017-01-21 121 views
0

我使用彈性2.2和Sense。Elasticsearch與And&Or查詢相同的查詢 - 布爾查詢?

我有以下問題來澄清我正在思考的一種方法。

Elasticsearch是一個全文搜索引擎,而不是一個SQL數據庫,但是它仍然可以在代數(AND,OR,WHERE等)方面思考ES查詢。

我不在乎這方面的分數。

假設我有以下的平坦文件類型的客戶,在各個領域都not_analysed,在映射屬性是:

"properties": { 
      "address": { 
      "type": "string", 
      "index": "not_analyzed" 
      }, 
      "age": { 
      "type": "long" 
      }, 
      "customerid": { 
      "type": "string", 
      "index": "not_analyzed" 
      }, 
      "firstname": { 
      "type": "string", 
      "index": "not_analyzed" 
      }, 
      "lastname": { 
      "type": "string", 
      "index": "not_analyzed" 
      }, 
      "updated": { 
      "type": "date", 
      "format": "date_hour_minute_second_millis" 
      } 
     } 

我現在指數:

PUT customers_ds/customers/1 
{ 
    "customerid": "1", 
    "firstname": "Marie", 
    "address": "Brazil", 
    "updated": "2017-01-13T02:36:37.292", 
    "lastname": "Doe", 
    "age": 20 
} 



PUT customers_ds/customers/2 
{ 
    "customerid": "1", 
    "firstname": "John", 
    "address": "North America", 
    "updated": "2017-01-13T02:36:37.292", 
    "lastname": "Doe", 
    "age": 25 
} 

什麼我應該寫的查詢說:

我希望所有的客戶在那裏的第一個名字是瑪麗,或者他們生活在「北美」

select * from customers where firstname = "Marie" or address = "North America" 

如何寫這樣ES查詢?

最後,如何寫:

select * from customers where firstname = "Marie" and lastname = "Doe" or address = "North America" 

在這最後詢問我想從ES找回:由於OR的

瑪麗和約翰。或地址=「北美」,而瑪麗將在AND中匹配。讓我知道這是否清楚。

???

+0

「分析所有字段」=>您映射中的所有字符串字段都是「not_analyzed」。你能澄清嗎? – Val

+0

HI @Val - 我的意思是不分析所有字段的位置。我正在編輯它 –

回答

2

如果你想要一個OR查詢,你可以做這樣的:

{ 
    "query": { 
     "bool": { 
     "minimum_should_match": 1, 
     "should": [ 
      { 
       "term": { 
        "firstname": "Marie" 
       } 
      }, 
      { 
       "term": { 
        "address": "North America" 
       } 
      } 
     ] 
     } 
    } 
} 

如果你想要一個和查詢,你可以簡單地替換shouldfilter(或must如果你在乎分數):

{ 
    "query": { 
    "bool": { 
     "minimum_should_match": 1, 
     "should": [ 
     { 
      "bool": { 
      "must": [ 
       { 
       "term": { 
        "firstname": "Marie" 
       } 
       }, 
       { 
       "term": { 
        "lastname": "Doe" 
       } 
       } 
      ] 
      } 
     }, 
     { 
      "term": { 
      "address": "North America" 
      } 
     } 
     ] 
    } 
    } 
} 
+0

嗨@Val - 是的,如果我想要和與OR在同一個查詢中: select * from customers where firstname =「Marie」and lastname =「Doe」or address =「North America」 所以我應該回到這個例子中,Marie和JOhn,因爲John的姓氏= Doe,住在北美,那是OR –

+0

你知道如何在同一個查詢中獲得AND和OR,就像上面的例子? –

+0

這就是我在第二個查詢中所做的 – Val

0

對於OR查詢使用過濾器,我們爲您不採取分數關心

{ 
    "filtered" : { 
     "query" : { 
      "term" : { "firstname" : "Marie" } 
     }, 
     "filter" : { 
      "or" : [ 
       { 
        "term" : { "address" : "north america" } 
       } 
      ] 
     } 
    } 
} 
+0

沒有結果... –