接上一章基礎檢索,在上一章部落格中,我在ES中插入了許多的資料,接下來就基于之前的資料進行一些進階的操作
ES的進階查詢有它自己的語言----QueryDSL
ES提供了一個可以執行查詢的JSON風格的DSL,被稱為QueryDSL,這個語言很全面,但是稍顯複雜,先來體驗一哈
可以看到,QueryDSL查詢是通過get發送請求,并攜帶一個json資料,這個json資料包含我們的查詢條件,其文法格式如下
{
查詢名1:{
條件1:值1
},
查詢名2:{
條件2:值2
},
.....
}
match 分詞比對查詢
match查詢會對檢索條件進行分詞比對,隻要資料比對其中的一個字元,都會被查詢出來,最後根據得分排序傳回
# 文法格式
# 查詢每個字段值為多少的資料,支援模糊查詢
GET bank/_search # 請求體
{
"query": { # 查詢
"match": { # 比對查詢
"FIELD": "TEXT" # 字段:值
}
}
}
match_phrase 短語比對
match_phrase 會将檢索條件的值作為一個整個進行檢索
GET bank/_search
{
"query": {
"match_phrase": {
"FIELD": "PHRASE"
}
}
}
multi_match 多字段比對
查詢多個字段中包含某個值的資料,并且會對查詢條件進行分詞比對
GET bank/_search
{
"query": {
"multi_match": {
"query": "", # 查詢條件
"fields": [] # 比對的字段
}
}
}
bool 複合查詢
複合查詢可以合并多個查詢條件,相當于mysql 中的and條件,查詢時需要滿足所有的條件
GET bank/_search
{
"query": {
"bool": {
"must": [ # 必須滿足這個條件
{}
],
"must_not": [ # 必須不是這個條件
{}
],
"should": [ # 可以包含這個條件
{}
]
.....
}
}
term 比對查詢
term和match一樣,都可以做精确比對,不同的是term不能做模糊查詢,term會将檢索條件的值作為一個整體去查詢,但是ES在存儲文本時存在資料分析的問題,相當于是分詞存儲,是以term在查詢多次文本時查不到資料,推薦在查詢非文本是使用term
GET bank/_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
aggregations 聚合
聚合提供了從資料中分組和提取資料的能力,最簡單的聚合方法大緻等于sql group by 和sql 聚合函數。
GET bank/_search
{
"aggs": {
"NAME": {
"AGG_TYPE": {}
}
}
}
示例1:搜尋address中包含mill的所有人的年齡分布以及平均年齡
示例2:按照年齡聚合,并請求這些年齡段的平均薪資
示例3:查詢所有年齡分布,并且在年齡段中M和F的平均薪資和總體平均薪資