Elasticsearch使用系列-基本查詢和聚合查詢+sql插件


Elasticsearch使用系列-ES簡介和環境搭建

Elasticsearch使用系列-ES增刪查改基本操作+ik分詞

Elasticsearch使用系列-基本查詢和聚合查詢+sql插件

Elasticsearch使用系列-.NET6對接Elasticsearch

Elasticsearch使用系列-Docker搭建Elasticsearch集群

一、基本查詢

1.And查詢must

GET user2/_search
{
  "query": {
    "bool":{
      "must": [
        {
          "match": {
            "name": "張三"
          }
        },
        {
          "match": {
            "hobby": "釣魚"
          }
        }
        
      ]
    }
  },
  "_source": ["name","age","hobby"],
  "sort": [
    { "age": {"order": "desc"}},
     { "name2": {"order": "asc"}}
  ],
  "from": 0,
  "size": 20
}
  • bool :And查詢屬於bool查詢,must里面帶And的查詢條件。
  • _source:要查詢的字段
  • sort:對查詢結果排序
  • from:分頁查詢,跳過多少條
  • size:分頁查詢,一頁查多少條

2.or查詢should

GET user2/_search
{
  "query": {
    "bool":{
      "should": [
        {
          "match": {
            "name": "張三"
          }
        },
        {
          "match": {
            "hobby": "釣魚"
          }
        }
        
      ]
    }
  }
}
  • bool:or查詢屬於bool查詢
  • should:里面放or的查詢條件

3.排除查詢 must_not

#查詢名字不等於張三
GET user2/_search
{
  "query": {
    "bool":{
      "must_not": [
        {
          "match": {
            "name": "張三"
          }
        }
        
      ]
    }
  }
}

 4.過濾查詢filter

#查詢名字等於張三,年齡大於等於10小於等於20
GET user2/_search
{
  "query": {
    "bool":{
      "must": [
        {
          "match": {
            "name": "張三"
          }
        }
        
      ],
      "filter": [
        {"range": {
          "age": {
            "gte": 10,
            "lte": 20
          }
        }}
      ]
    }
    
  }
}
  • filter:過濾條件,先過濾數據再查詢結果
  • range:范圍查詢,和term,match是同類的查詢。
  • gte:大於等於
  • gt:大於
  • lte:小於等於
  • lt:小於

5.同字段多值查詢

GET user2/_search
{
  "query": {
     "terms": {
           "name2": ["張三","李四"]
         }
  }
}

 

#text類型的多值查詢,空格隔開
GET user2/_search
{
  "query": {
    "match": {
           "name": "張三 李四"
         }
  }
}

6.高亮查詢highlight

高亮查詢,就是平時搜索東西時,搜索結果會把你的關鍵詞匹配到的顯示顏色,像下圖一樣。

 

 

 

高亮展示的數據,本身就是文檔中的一個field,單獨將field以highlight的形式返回給你。
ES提供了一個highlight屬性,和query同級別的。

  • pre_tag:指定前綴標簽,如 <font color="red">
  • post_tags:指定后綴標簽,如 </font>
  • fields:指定那個字段為高亮字段

 

 

 查出來后,顯示hobby字段的地方,就直接用高亮的hobby展示就行了。

二、聚合查詢

bucket:分組后統計,類似於Mysql中的group by 

metric:對分組統計的結果,計算最大值,最小值,平均值等,類似於Mysql中的max(),min(),avg()函數的值。

1.准備數據

創建索引

PUT employee
{
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "name": {
        "type": "keyword"
      },
      "job": {
        "type": "keyword"
      },
      "age": {
        "type": "integer"
      },
      "gender": {
        "type": "keyword"
      }
    }
  }
}

批量插入數據

PUT employee/_bulk
{"index": {"_id": 1}}
{"id": 1, "name": "Bob", "job": "java", "age": 21, "sal": 8000, "gender": "male"}
{"index": {"_id": 2}}
{"id": 2, "name": "Rod", "job": "html", "age": 31, "sal": 18000, "gender": "female"}
{"index": {"_id": 3}}
{"id": 3, "name": "Gaving", "job": "java", "age": 24, "sal": 12000, "gender": "male"}
{"index": {"_id": 4}}
{"id": 4, "name": "King", "job": "dba", "age": 26, "sal": 15000, "gender": "female"}
{"index": {"_id": 5}}
{"id": 5, "name": "Jonhson", "job": "dba", "age": 29, "sal": 16000, "gender": "male"}
{"index": {"_id": 6}}
{"id": 6, "name": "Douge", "job": "java", "age": 41, "sal": 20000, "gender": "female"}
{"index": {"_id": 7}}
{"id": 7, "name": "cutting", "job": "dba", "age": 27, "sal": 7000, "gender": "male"}
{"index": {"_id": 8}}
{"id": 8, "name": "Bona", "job": "html", "age": 22, "sal": 14000, "gender": "female"}
{"index": {"_id": 9}}
{"id": 9, "name": "Shyon", "job": "dba", "age": 20, "sal": 19000, "gender": "female"}
{"index": {"_id": 10}}
{"id": 10, "name": "James", "job": "html", "age": 18, "sal": 22000, "gender": "male"}
{"index": {"_id": 11}}
{"id": 11, "name": "Golsling", "job": "java", "age": 32, "sal": 23000, "gender": "female"}
{"index": {"_id": 12}}
{"id": 12, "name": "Lily", "job": "java", "age": 24, "sal": 2000, "gender": "male"}
{"index": {"_id": 13}}
{"id": 13, "name": "Jack", "job": "html", "age": 23, "sal": 3000, "gender": "female"}
{"index": {"_id": 14}}
{"id": 14, "name": "Rose", "job": "java", "age": 36, "sal": 6000, "gender": "female"}
{"index": {"_id": 15}}
{"id": 15, "name": "Will", "job": "dba", "age": 38, "sal": 4500, "gender": "male"}
{"index": {"_id": 16}}
{"id": 16, "name": "smith", "job": "java", "age": 32, "sal": 23000, "gender": "male"}

2.分組統計

查詢員工各種語言數量,相當於group by

#查詢員工各種語言數量
GET employee/_search
{
  "size": 0,
  "aggs": {
    "languge_count": {
      "terms": {
        "field": "job"
      }
    }
  }
}

 

  •  size:0表示只要統計后的結果,原始數據不展現,如果是大於0,則會返回多少條原始數據
  •  aggs:固定語法
  •  languge_count:自定義的分組名稱,可以隨便寫
  •  terms:按什么字段進行分組
  •  field:具體的字段名稱

3.平均值,最大值,最小值,求和統計

GET employee/_search
{
  "size": 0,
  "aggs": {
    "language_count": {
      "terms": {
        "field": "job"
      },
      "aggs":{
        "age_avg":{
          "avg":{
            "field": "age"
          }
        }
      }
    }
  }
}

 

 

  • aggs:固定寫法
  • age_avg:自定義統計名稱,隨便寫
  • avg:平均值,其他有 max:最大值,min:最小值,sum:求和
  • fileld:要計算的字段

4.分段統計

#按年齡區間分段統計
GET employee/_search
{
  "size": 0,
  "aggs": {
    "language_count": {
      "histogram": {
        "field": "age",
        "interval": 10
      },
      "aggs":{
        "age_avg":{
          "sum":{
            "field": "age"
          }
        }
      }
    }
  }
}

 

 

 

 

 

  • histogram:分段統計
  • interval:分段間隔

5.日期分段統計

#按月份統計生日人數
GET employee/_search
{
  "size": 0,
  "aggs": {
    "language_count": {
      "date_histogram": {
        "field": "borthday",
        "interval": "month",
        "format": "yyyy-MM-dd",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "1970-10-01",
          "max": "2022-12-31"
        }
        
      }
    }
  }
}
  • date_histogram:日期分段統計函數
  • field:聚合分組的字段,類型需要為date
  • interval:按什么時間聚合,interval字段支持多種關鍵字:year, quarter(季度), month, week, day, hour, minute, second,
  • format:返回值格式化
  • min_doc_count:0分組后沒數據的也顯示,最小有多少條才顯示
  • extended_bounds:強制規定最小值和最大值界限,ES默認把有數據的最小值開始做開始界限

6.同時統計多個集合

#分別統計年齡和性別
GET employee/_search
{
  "size": 0,
  "aggs": {
    "language_count": {
      "histogram": {
        "field": "age",
        "interval": 10
      },
      "aggs":{
        "age_avg":{
          "sum":{
            "field": "age"
          }
        }
      }
    },
    "gender_count":{
      "terms": {
        "field": "gender"
      }
    }
  }
}

三、sql插件

1.插件安裝

上面的查詢語句為DSL查詢,sql插件可以編寫sql語句,然后自動解析為DSL語句查詢

sql插件github地址:https://github.com/NLPchina/elasticsearch-sql

 

 

 

 下載的對應es的版本。

解壓后放到 plugins 文件夾並改名為sql,然后重啟es

 

2.sql語句查詢

2.1普通查詢

GET /_sql?format=txt
{
  "query": "select * from employee where job='java'"
  
}

 

 

 2.2其他查詢寫法

#普通查詢  
SELECT * FROM bank WHERE age >30 AND gender = 'm'
#聚合查詢(分組統計)
select COUNT(*),SUM(age),MIN(age) as m, MAX(age),AVG(age)
  FROM bank GROUP BY gender ORDER BY SUM(age), m DESC
#刪除 
DELETE FROM bank WHERE age >30 AND gender = 'm'

更多的查詢看sql插件的github地址最下面的說明

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM