Elasticsearch 的查询过滤语句

2015-09-01 09:20:01   最后更新: 2015-09-02 11:35:00   访问数量:2784




Elasticsearch 提供了丰富的查询过滤语句,对于查询过程中的各种场景非常有用

 

term 用于精确匹配,常用于数字、日期、布尔值或 not_analyzed 字符串的匹配

{ "term": { "age": 26 }} { "term": { "date": "2014-09-01" }} { "term": { "public": true }} { "term": { "tag": "full_text" }}

 

 

terms 跟 term 有点类似,但 terms 允许指定多个匹配条件

如果某个字段指定了多个值,那么文档需要一起去做匹配

{ "terms": { "tag": [ "search", "full_text", "nosql" ] } }

 

 

range 过滤允许我们按照指定范围查找一批数据

{ "range": { "age": { "gte": 20, "lt": 30 } } }

 

范围操作符包括:

  • gt -- 大于
  • gte -- 大于等于
  • lt -- 小于
  • lte -- 小于等于

 

exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的 IS_NULL 条件

{ "exists": { "field": "title" } }

 

这两个过滤只是针对已经查出一批数据来,但是想区分出某个字段是否存在的时候使用

 

prefix 可以通过给定的前缀对字段进行过滤

{ "prefix": { "account.cardNo": "6225" } }

 

 

使用regexp查询能够让你通过正则表达式对字段进行过滤

{ "query": { "regexp": { "postcode": "W[0-9].+" } } }

 

这个正则表达式的规定了词条需要以W开头,紧跟着一个0到9的数字,然后是一个或者多个其它字符

 

可以在 wildcard 过滤中使用 * 作为通配符进行查询,但是查询语句中需要对以下字符进行转义:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /

{ "wildcard": { "account.cardNo": "*6225*" } }

 

 

query_string 对于 analysis 的字段进行检索可以达到全文检索的目的

他会首先将查询字符串传入合适的分词解析器,用来得到需要查询的词条列表

{ "wildcard": { "account.cardNo": "*6225*" } }

 

对于 not_analysis 的字段,他与 wildcard 是一样的

 

与 query_string 类似,match 是另一个高级查询的过滤条件

match 对于 analysis 的字段进行检索前也会先到分词解析器中获取需要查询的词条列表

但与 query_string 不同,得到词条列表后,match 只会使用 term 来执行具体的查询

{ "query": { "match": { "title": "QUICK!" } } }

 

 

multi_match查询允许你做match查询的基础上同时搜索多个字段

{ "multi_match": { "query": "full text search", "fields": [ "title", "body" ] } }

 

 

bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符

  • must -- 多个查询条件的完全匹配,相当于 and
  • must_not -- 多个查询条件的相反匹配,相当于 not
  • should -- 至少有一个查询条件匹配, 相当于 or

 

这些参数可以分别继承一个过滤条件或者一个过滤条件的数组

{ "bool": { "must": { "term": { "folder": "inbox" }}, "must_not": { "term": { "tag": "spam" }}, "should": [ { "term": { "starred": true }}, { "range": { "date": { "gte": "2014-01-01" }}} ] } }

 

 

match_all 用于查询所有文档,是没有查询条件下的默认语句

{ "match_all": {} }

 

此查询常用于合并过滤条件

比如说你需要检索所有的邮箱,所有的文档相关性都是相同的,所以得到的_score为1

 






读书笔记      技术帖      龙潭书斋      query_string      filter      过滤      语句      match      multi_match      range      terms      term      exists      missing      bool      match_all      wildcard      转义      全文检索      fulltext     


京ICP备15018585号