天天看點

ElasticSearch 進階檢索

  接上一章基礎檢索,在上一章部落格中,我在ES中插入了許多的資料,接下來就基于之前的資料進行一些進階的操作

  ES的進階查詢有它自己的語言----QueryDSL

  ES提供了一個可以執行查詢的JSON風格的DSL,被稱為QueryDSL,這個語言很全面,但是稍顯複雜,先來體驗一哈

ElasticSearch 進階檢索

  可以看到,QueryDSL查詢是通過get發送請求,并攜帶一個json資料,這個json資料包含我們的查詢條件,其文法格式如下

{
	查詢名1:{
		條件1:值1
	},
	查詢名2:{
		條件2:值2
	},
	.....
}
           

match 分詞比對查詢

  match查詢會對檢索條件進行分詞比對,隻要資料比對其中的一個字元,都會被查詢出來,最後根據得分排序傳回

# 文法格式
# 查詢每個字段值為多少的資料,支援模糊查詢
GET bank/_search  # 請求體
{
  "query": {	# 查詢
    "match": {	# 比對查詢
      "FIELD": "TEXT"	# 字段:值
    }
  }
}
           
ElasticSearch 進階檢索

match_phrase 短語比對

  match_phrase 會将檢索條件的值作為一個整個進行檢索

GET bank/_search
{
  "query": {
    "match_phrase": {
      "FIELD": "PHRASE"
    }
  }
}
           
ElasticSearch 進階檢索

multi_match 多字段比對

  查詢多個字段中包含某個值的資料,并且會對查詢條件進行分詞比對

GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "",	# 查詢條件
      "fields": []	# 比對的字段
    }
  }
}
           
ElasticSearch 進階檢索

bool 複合查詢

  複合查詢可以合并多個查詢條件,相當于mysql 中的and條件,查詢時需要滿足所有的條件

GET bank/_search
{
  "query": {
    "bool": {
      "must": [ # 必須滿足這個條件
        {}
      ],
      "must_not": [ # 必須不是這個條件
        {}
      ],
      "should": [ # 可以包含這個條件
        {}
       ]
       .....
  }
}
           
ElasticSearch 進階檢索

term 比對查詢

  term和match一樣,都可以做精确比對,不同的是term不能做模糊查詢,term會将檢索條件的值作為一個整體去查詢,但是ES在存儲文本時存在資料分析的問題,相當于是分詞存儲,是以term在查詢多次文本時查不到資料,推薦在查詢非文本是使用term

GET bank/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}
           
ElasticSearch 進階檢索

aggregations 聚合

  聚合提供了從資料中分組和提取資料的能力,最簡單的聚合方法大緻等于sql group by 和sql 聚合函數。

GET bank/_search
{
  "aggs": {
    "NAME": {
      "AGG_TYPE": {}
    }
  }
}
           

  示例1:搜尋address中包含mill的所有人的年齡分布以及平均年齡

ElasticSearch 進階檢索

  示例2:按照年齡聚合,并請求這些年齡段的平均薪資

ElasticSearch 進階檢索

  示例3:查詢所有年齡分布,并且在年齡段中M和F的平均薪資和總體平均薪資

ElasticSearch 進階檢索

繼續閱讀