2014-11-15 91 views
0

我有一個人數據庫的索引與下面的映射。elasticsearch搜索過濾器等於問題

{ 
    "person" : { 
       "sex"  : { "type" : "string" }, 
       "dob"  : { "type" : "string" },   
       "fname"  : { "type" : "string" }, 
       "lname"  : { "type" : "string" }, 
       "phone"  : { "type" : "string" } 
     } 
} 

我的需求是找到所有與多個條件子句匹配的條目。

杜伯+電話+性別(OR)FNAME LNAME + +出生日期

如何創造上述條件的查詢或過濾器(使用布爾)。此外,我需要查詢或過濾不區分大小寫。

任何想法?

謝謝

回答

1

嵌套兩套必須的查詢應查詢見面會您的要求,請參閱bool獲取更多信息:

curl -XGET 'http://localhost:9200/people/person/_search?pretty' -d '{ 
    "query": { 
     "bool": { 
     "should": [ 
      {"bool": { 
       "must": [ 
        {"match": { "sex" : "male" }}, 
        {"match": { "dob" : "2000-11-14" }}, 
        {"match": { "phone" : "1234 67889" }} 
       ] 
       } 
      }, 
      {"bool": { 
       "must": [ 
        {"match": { "fname" : "bob" }}, 
        {"match": { "dob" : "2000-11-14" }}, 
        {"match": { "lname" : "smith" }} 
       ] 
       } 
      } 
      ] 
     } 
    } 
}' 

此外,我需要查詢或過濾器不區分大小寫。

標準分析儀將索引小寫的數據 - match查詢會將相同的分析儀應用於您的搜索詞。

另外 - 將DOB作爲日期存儲是個好主意。

+0

Thanks @olly。我讀過濾器比匹配更快。有什麼方法可以使用過濾器嗎? – user3658423

+0

您可以用「過濾器」替換「查詢」。然後,您需要將「匹配」替換爲「術語」。您還需要創建一個自定義的小寫分析器,它不會標記數據並確保傳遞給過濾器的值始終爲小寫。在功能上你在做什麼是一個查詢 - 你最好擁有它提供的靈活性。 TL; DR:堅持使用「查詢」,您可能不會注意到性能差異。 –

0

你應該改變你的映射到一個嵌套的對象,比你可以使用嵌套的過濾器或查詢。既然你想做它不區分大小寫,你需要嵌套查詢中的匹配查詢。

有關映射的更多信息: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-nested-type.html#mapping-nested-type

{ 
    "type1" : { 
     "properties" : { 
      "person" : { 
       "type" : "nested", 
       "properties": { 
        "sex" : {"type": "string" }, 
        "dob" : {"type": "string" } 
       } 
      } 
     } 
    } 
} 

然後創建嵌套查詢: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html#query-dsl-nested-query

{ 
    "nested" : { 
     "path" : "person", 
     "query" : { 
      "bool" : { 
       "must" : [ 
        { 
         "match" : {"person.dob" : "xx"} 
        }, 
        { 
         "range" : {"person.sex" : "male"} 
        } 
       ] 
      } 
     } 
    } 
}