2014-11-15 50 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"} 
        } 
       ] 
      } 
     } 
    } 
}