ElasticSearch基本查询(Filter查询)

ElasticSearch基本查询(Filter查询)

1、数据准备

2、简单的过滤查询

3、bool过滤查询

4、范围过滤

5、过滤非空、判断存在

6、过滤器缓存

7、聚合查询

对人工智能感兴趣的同学,可以点击以下链接:

现在人工智能非常火爆,很多朋友都想学,但是一般的教程都是为博硕生准备的,太难看懂了。最近发现了一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默。所以忍不住分享一下给大家。点这里可以跳转到教程。

https://www.cbedai.net/u014646662

filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。

1、数据准备

POST /lib4/items/_bulk
{"index": {"_id": 1}}
{"price": 40,"itemID": "ID100123","title":"successful"}
{"index": {"_id": 2}}
{"price": 50,"itemID": "ID100124","title":"successful"}
{"index": {"_id": 3}}
{"price": 25,"itemID": "ID100124","title":"failed"}
{"index": {"_id": 4}}
{"price": 30,"itemID": "ID100125","title":"failed"}
{"index": {"_id": 5}}
{"price": 40,"itemID": "ID100125","title":"failed"}
{"index": {"_id": 6}}
{"price": null,"itemID": "ID100127,"title":"failed"}

2、简单的过滤查询

GET /lib4/items/_search
{ 
  "post_filter":{
    "term":{"price": 40}
  }
}

GET /lib4/items/_search
{ 
  "post_filter":{
    "terms":{"price":[25,50]}
  }
}
GET /lib4/items/_search
{ 
  "post_filter":{
   "terms":{"itemID.keyword":["ID100124","ID100123"]}
  }
}

查看分词器分析的结果:

GET /lib4/_mapping
{
  "lib4": {
    "mappings": {
      "items": {
        "properties": {
          "itemID": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "price": {
            "type": "long"
          },
          "title": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

3、bool过滤查询

可以实现组合过滤查询
格式:

{
    "bool": {
        "must": [],
        "should": [],
        "must_not": []
    }
}

must:必须满足的条件---and
should:可以满足也可以不满足的条件--or
must_not:不需要满足的条件--not
下一篇博客会做更详细的介绍,这里主要是说过滤

GET /lib4/items/_search
{ 
  "post_filter":{
    "bool":{
      "should":[
       {"term": {"itemID.keyword": "ID100124"} },
       {"term":{"price":25}}
        ],
        "must_not":{"term":{"price":50}}
    }
  }
}

嵌套使用bool:


GET /lib4/items/_search
{
    "post_filter": {
          "bool": {
                "should": [
                    {"term": {"itemID.keyword": "id100123"}},
                    {
                      "bool": {
                          "must": [
                              {"term": {"price": 40}}
                            ]
                          }
                    }
                  ]
                }
            }
}

4、范围过滤

gt: >
lt: <
gte: >=
lte: <=

get lib4/items/_search
{
  "post_filter":{
    "range":{
      "price":{"gt":20,"lt":50}
    }
  }
}

5、过滤非空

get lib4/items/_search
{
  "query":{
    "constant_score": {
      "filter": {
        "exists": {
          "field": "price"
        }
      }
    }
  }
}
get lib4/items/_search
{
  "query":{
    "constant_score": {
      "filter": {"exists": {
        "field": "price"
      }}
    }
  }
}

6、过滤器缓存

ElasticSearch提供了一种特殊的缓存,即过滤器缓存(filter cache),用来存储过滤器的结果,被缓存的过滤器并不需要消耗过多的内存(因为它们只存储了哪些文档能与过滤器相匹配的相关信息),而且可供后续所有与之相关的查询重复使用,从而极大地提高了查询性能。
注意:ElasticSearch并不是默认缓存所有过滤器,
以下过滤器默认不缓存:

numeric_range、script、geo_bbox、geo_distance、geo_distance_range、geo_polygon、geo_shape、and、or、not

默认是开启缓存的过滤器:
exists,missing,range,term,terms

开启方式:在filter查询语句后边加上
 

"_catch":true

7、聚合查询

sum、min、max、avg、cardinality:求基数、terms:分组

以求和为例:

GET /lib4/items/_search
{
  "size":0,
  "aggs": {
    "price_sum": { //名字自定义
      "sum": {
        "field": "price"
      }
    }
  }
}

执行结果

{
  "took": 9,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 5,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "price_sum": {
      "value": 185
    }
  }
}

对那些有游泳兴趣的用户按年龄分组

GET /lib3/user/_search
{
  "query": {
      "match": {
        "interests": "youyong"
      }
   },
   "size": 0, 
   "aggs":{
       "age_group_by":{
           "terms": {
             "field": "age",
             "order": {
               "avg_of_age": "desc"
             }
           },
           "aggs": {
             "avg_of_age": {
               "avg": {
                 "field": "age"
               }
             }
           }
       }
   }
}

//数据参见上一篇博客

执行结果如下:

{
  "took": 9,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 4,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "age_group_by": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": 22,
          "doc_count": 1,
          "avg_of_age": {
            "value": 22
          }
        },
        {
          "key": 20,
          "doc_count": 2,
          "avg_of_age": {
            "value": 20
          }
        },
        {
          "key": 18,
          "doc_count": 1,
          "avg_of_age": {
            "value": 18
          }
        }
      ]
    }
  }
}

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值