首頁 > 軟體

Elasticsearch聚合查詢及排序操作範例

2022-04-19 19:02:42

1 es排序

# 1 排序
GET jeff/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
   "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}
# 升序
GET jeff/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
   "sort": [
    {
      "age": {
        "order": "asc"
      }
    }
  ]
}
# 並不是所有型別都支援排序(只允許數位型別做排序)
GET jeff/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
   "sort": [
    {
      "name": {
        "order": "asc"
      }
    }
  ]
}

2 match和match的區別

# match和match_all的區別?
mach表示要查詢,根據欄位查,match_all查所有
GET jeff/doc/_search
{
  "query": {
    "match_all": {}
  }
}

3 分頁查詢

GET jeff/doc/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ], 
  "from": 2,
  "size": 1
}
#   "from": 2,代表從第二條開始, 取一條"size": 1
# 有了這個查詢,如何分頁?
一頁有10條資料
第一頁:
  "from": 0,
  "size": 10
第二頁:
  "from": 10,
  "size": 10
第三頁:
  "from": 20,
  "size": 10

4 es 組合查詢

# 多個條件,and ,or ,not
# 對到es中就是布林查詢,must,should,must_not,filter
must  ---  and 
should --- or
must_not --- not
filter --- 過濾
# 1 組合查詢之must
# 查詢form gu和age=30的資料
GET gyy/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "from": "gu"
          }
        },
        {
          "match": {
            "age": "30"
          }
        }
      ]
    }
  }
}
# 查詢form gu資料()
GET gyy/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "from": "gu"
          }
        }
      ]
    }
  }
}
# 同上
GET gyy/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  }
}
# 2 組合查詢之should,或者的條件
GET gyy/doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "from": "gu"
          }
        },
        {
          "match": {
            "tags": "閉月"
          }
        }
      ]
    }
  }
}
# 3 組合查詢之must_not  取反
GET gyy/doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "from": "gu"
          }
        },
        {
          "match": {
            "tags": "可愛"
          }
        },
        {
          "match": {
            "age": 18
          }
        }
      ]
    }
  }
}
# `filter`條件過濾查詢,過濾條件的範圍用`range`表示,`gt`表示大於,大於多少呢
# gt:大於   lt:小於  get:大於等於   let:小於等於
GET gyy/doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "from": "gu"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gt": 25
          }
        }
      }
    }
  }
}
# 查詢年齡小於等於18的所有資料
GET gyy/doc/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "lte": 18
          }
        }
      }
    }
  }
}

5 結果過濾展示字端

# 對結果進行過濾,類似於如下
select * from user;
select name,age from user;
# 對應到es的查詢
GET gyy/doc/_search
{
  "query": {
    "match": {
      "name": "顧老二"
    }
  },
  "_source": ["name", "age"]
}

6 結果高亮展示

# 3 結果高亮顯示(預設情況)
GET gyy/doc/_search
{
  "query": {
    "match": {
      "name": "石頭"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}
# 客製化高亮顯示的樣式
GET gyy/chengyuan/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "highlight": {
    "pre_tags": "<b class='key' style='color:red'>",
    "post_tags": "</b>",
    "fields": {
      "from": {}
    }
  }
}

小結:

混合開發,你知道怎麼處理

前後端分離,你怎麼處理?

<b class='key' style='color:red'>串直接以josn格式返回,前端自行渲染

用的最多就是match+布林+高亮+分頁

7 聚合查詢avg、max、min、sum、分組

# 聚合查詢
# 1 聚合查詢之avg
select max(age) as my_avg from user;
GET gyy/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_avg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "_source": ["name", "age"]
}
# 2 聚合查詢之max,size=0表示不取資料,只要max的結果
GET gyy/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_max": {
      "max": {
        "field": "age"
      }
    }
  },
  "size": 0
}
# 3 聚合之min
GET gyy/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_min": {
      "min": {
        "field": "age"
      }
    }
  },
  "size": 0
}
# 4 聚合查詢之sum
GET gyy/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_sum": {
      "sum": {
        "field": "age"
      }
    }
  },
  "size": 0
}
# 5 聚合之分組
GET gyy/doc/_search
{
  "size": 0, 
  "query": {
    "match_all": {}
  },
  "aggs": {
    "age_group": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 15,
            "to": 20
          },
          {
            "from": 20,
            "to": 25
          },
          {
            "from": 25,
            "to": 30
          }
        ]
      }
    }
  }
}

8 mapping和_template模版

 

GET _template/user_instagram  # 檢視模版
PUT _template/user_instagram  # 修改模版
{跟欄位資訊資料}
GET user_instagram/_mapping  # 檢視索引資訊
PUT user_instagram/_mapping  # 修改索引資訊
{跟欄位資訊資料}

模版中如果有name欄位,存的時候會在索引中自動匹配

模版中如果沒有age欄位,存的時候索引找不到欄位,存不進去。

需要現在模版中新增欄位,再到索引中新增欄位,索引生成之後需要手動新增欄位,不會自動生成
 

# 檢視索引資訊---》mapping字典---》對映(型別,表型別,表結構)
GET user_instagram/_mapping
# 6.x以後一個索引只能有一個對映型別(只能有一個表)
# 建立對映
# 建立索引,並設定對映
PUT _template/user_instagram
{
    "order" : 1,
    "index_patterns" : [
      "user_instagram-v1_0"
    ],
    "settings" : {
      "index" : {
        "default_pipeline" : "auto_timestamp_pipeline",
        "mapping" : {
          "total_fields" : {
            "limit" : "10000"
          }
        },
        "refresh_interval" : "600s",
        "number_of_shards" : "8",
        "number_of_replicas" : "0",
        "max_inner_result_window" : "50000"
      }
    },
    "mappings" : {
      "_meta" : {
        "software_version_mapping" : "1.0"
      },
      "dynamic" : "strict",
      "properties" : {
        "is_private" : {
          "type" : "boolean"
        },
        "full_name" : {
          "type" : "text"
        },
        "create_time" : {
          "type" : "date"
        },
        "avatar_url" : {
          "type" : "text"
        },
        "user_id" : {
          "eager_global_ordinals" : true,
          "type" : "keyword"
        },
        "follower_num" : {
          "type" : "integer"
        },
        "following_num" : {
          "type" : "integer"
        },
        "post_count" : {
          "type" : "integer"
        },
        "nickname" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "ignore_above" : 256,
              "type" : "keyword"
            }
          },
          "doc_values" : false
        },
        "requested_by_viewer" : {
          "type" : "boolean"
        },
        "is_verified" : {
          "type" : "boolean"
        },
        "followed_by_viewer" : {
          "type" : "boolean"
        }
      }
    },
    "aliases" : {
      "user_instagram" : { }
    }
  }
# 插入測試資料
PUT books/_doc/1
{
  "title":"大頭兒子小偷爸爸",
  "price":100,  
  "addr":"北京天安門",
  "company":{
    "name":"我愛北京天安門",
    "company_addr":"我的家在東北松花江傻姑娘",
    "employee_count":10
  },
  "publish_date":"2019-08-19"
}
PUT books/_doc/2
{
  "title":"白雪公主和十個小矮人",
  "price":"99",
  "addr":"黑暗森裡",
  "company":{
    "name":"我的家鄉在上海",
    "company_addr":"朋友一生一起走",
    "employee_count":10
  },
  "publish_date":"2018-05-19"
}
PUT books/_doc/3
{
  "title":"白雪公主和十個小矮人",
  "price":"99",
  "addr":"黑暗森裡",
  "age":18
}
# 檢視對映
GET books
GET books/_mapping

對映是什麼?對映有什麼用?  規定了表結構(不是強制的),規定了哪個欄位是可以用來全文檢索,是否是數位型別,布林型別

mapping型別一旦確定,以後就不能修改了,但是可以插入欄位

9 ik分詞

# 全文檢索,有了對映,決定了我可以對某個欄位做全文檢索
# es預設分詞對英文友好,使用中文分詞器(es的外掛),ik(作者,中國人,elasticsearch開源社群負責人)
# 是es的一個外掛(es如何安裝外掛)
#第一種:命令列(內建外掛)
  	bin/elasticsearch-plugin install analysis-smartcn  安裝中文分詞器
#第二種:url安裝(第三方外掛)
  	bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.0/elasticsearch-analysis-ik-7.5.0.zip
#第三種:手動安裝(推薦用)
  #下載,解壓到es的plugins路徑下,重啟es即可
  #注意:ik分詞器跟es版本一定要對應
# 兩種分詞方式
  # ik_smart:分詞分的
  # ik_max_word :分詞分的多
  # ik_smart分的詞少,粒度大
  GET _analyze
  {
    "analyzer": "ik_smart",
    "text": "上海自來水來自海上"
  }
  # ik_smart分的詞多,粒度小
  GET _analyze
  {
    "analyzer": "ik_max_word",
    "text": "上海自來水來自海上"
  }
# 在建立對映的時候設定
# 以後你的操作:
#文章標題:ik_max_word
#文章內容:ik_smart
#摘要
#作者
#建立時間

10 term和match的區別

# match:我們今天出去玩 ----》分詞---》按分詞去搜
#term:我們今天出去玩---》直接拿著[我們今天出去玩]---&gt;去索引中查詢
# 查不到內容,直接拿著  Python爬蟲 去查,因為沒有索引,所以查不到
GET books/_search
{
  "query":{
    "term":{
      "title":"Python爬蟲"
    }
  }
}
# 能查到,而且帶python的都查出來了
# Python   爬蟲  分了詞,分別拿著這兩個詞去查,帶python關鍵字,帶爬蟲關鍵字都能查到
GET books/_search
{
  "query":{
    "match":{
      "title":"Python爬蟲"
    }
  }
}

以上就是Elasticsearch聚合查詢及排序操作範例的詳細內容,更多關於Elasticsearch聚合查詢及排序的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com