ElasticSearch查询

2 篇文章 0 订阅

ES 查询

使用情况

  • 过滤情况(filtering context):对文档进行过滤

  • 查询情况(query context):对文档进行评分

过滤查询的结果较少,结果会被缓存到内存中。评分查询计算较多(计算相关性),不会缓存。

通常的规则是,使用查询(query)语句来进行 全文 搜索或者其它任何需要影响 相关性得分 的搜索。除此以外的情况都使用过滤(filters)。

最重要的查询

match_all

查询简单的匹配所有文档,它经常与 filter 结合使用

{ "match_all": {}}

match

无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。

match 会进行分词

{ "match": { "tweet": "About Search" }}

multi_match

multi_match 查询可以在多个字段上执行相同的 match 查询

{
    "multi_match": {
        "query":    "full text search",
        "fields":   [ "title", "body" ] // 对 title、body 字段进行查询
    }
}

range

range 查询找出那些落在指定区间内的数字或者时间

gt:大于

gte:大于等于

lt:小于

lte:小于等于

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

term

term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串

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

terms

允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件

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

exists missing

exists 查询和 missing 查询被用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。这与 SQL 中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上具有共性

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

这些查询经常用于某个字段有值的情况和某个字段缺值的情况。

组合查询

布尔查询:将多查询组合成单一查询

接收参数:

must:文档 必须 匹配这些条件才能被包含进来

must_not:文档  必须不 匹配这些条件才能被包含进来

should:如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分

filter必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }}
        ],
        "filter": {
          "range": { "date": { "gte": "2014-01-01" }} 
        }
    }
}

也可以通过将布尔查询放到 filter 下实现多标准的过滤,并且不参与评分计算

{
    "bool": {
        "must":     { "match": { "title": "how to make millions" }},
        "must_not": { "match": { "tag":   "spam" }},
        "should": [
            { "match": { "tag": "starred" }}
        ],
        "filter": {
          "bool": { 
              "must": [
                  { "range": { "date": { "gte": "2014-01-01" }}},
                  { "range": { "price": { "lte": 29.99 }}}
              ],
              "must_not": [
                  { "term": { "category": "ebooks" }}
              ]
          }
        }
    }
}

constant_score 查询将一个不变的常量评分应用于所有匹配的文档,可以用来取代只有 filter 语句的布尔查询

{
    "constant_score":   {
        "filter": {
            "term": { "category": "ebooks" } 
        }
    }
}
{
    "filter": {
        "bool": {
           "must": {
                "term": { "category": "ebooks" }
            } 
        }
    }
}

验证查询

通过 validate-query API 可以用来验证查询是否合法

GET /gb/tweet/_validate/query?explain 
{
   "query": {
      "tweet" : {
         "match" : "really powerful"
      }
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值