文章目錄
- 查詢
- 全文查詢
- 詞語匹配 - match
- 短語匹配 - match_phrase
- 短語前綴匹配 - match_phrase_prefix
- 多字段匹配 - multi_match
- 查詢字符串查詢 - query_string
- 簡單字符串查詢 - simple_query_string
- 精確級別查詢
- 單個精確 - term
- 多查詢條件 - terms
- 範圍查詢 - range
- 存在與否查詢 - exists
- 術語前綴匹配 - prefix
- 通配符查詢 - wildcard
- 正則表達式查詢 - regexp
- 模糊查詢 - fuzzy
- 類型搜索 - type
- 主鍵查詢 - ids
- 複合查詢
- 常量分數查詢 - constant_score
- 條件查詢 - bool
- 最佳字段分值解析 - dis_max
- 分值函數計算查詢 - function_score
- 降低某些內容的評分 - boosting
- 多索引查詢 - indices
- 連接查詢
- 地理數據查詢
查詢
Elasticsearch提供豐富且靈活的查詢語言叫做DSL查詢(Query DSL),它允許你構建更加複雜、強大的查詢。DSL(Domain Specific Language特定領域語言)以JSON請求體的形式出現
查詢所有文檔 - match_all
GET /_search
{
"query": {
"match_all": {}
}
}
全文查詢
全文查詢是指對已經完成索引的文本字段進行查詢,它會對查詢詞進行分析,然後去全文進行匹配。
詞語匹配 - match
匹配查詢接受文本/數字/日期,分析它們,並構造一個查詢,它會將查詢詞分析後再去匹配。
GET /_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
短語匹配 - match_phrase
短語匹配會分析文本,並從分析文本中創建短語查詢,不會將查詢短語拆開。
GET /_search
{
"query": {
"match_phrase": {
"FIELD": "PHRASE"
}
}
}
短語前綴匹配 - match_phrase_prefix
它與短語匹配的區別爲它能匹配的方位更廣,它可以命中到短語+其他內容的內容
GET /_search
{
"query": {
"match_phrase_prefix": {
"FIELD": "PREFIX"
}
}
}
多字段匹配 - multi_match
它允許在多個字段上進行匹配,字段名允許通配符,還支持多種評分計算規則。是
GET /_search
{
"query": {
"multi_match": {
"query": "",
"fields": [],
"type": "best_fields"
}
}
}
查詢字符串查詢 - query_string
一種使用查詢解析器來解析其內容的查詢,可以在多值上,設置查詢條件之間的關係
GET /_search
{
"query": {
"query_string": {
"default_field": "FIELD",
"query": "this AND that OR thus",
"fields": [],
"default_operator": "OR"
}
}
}
簡單字符串查詢 - simple_query_string
類似於短語匹配,於字符串查詢相比,它不會拋出異常,並丟棄查詢無效的部分。
GET /_search
{
"query": {
"simple_query_string": {
"query": "",
"fields": [],
"default_operator": "OR"
}
}
}
精確級別查詢
它是對索引後的倒排索引進行查詢的,這些查詢通常用於諸如數字、日期和枚舉等結構化數據,而不是完整的文本字段。
單個精確 - term
術語查詢會找到包含反向索引中指定的確切術語的文檔,即它不會對查詢詞進行分析。
GET /_search
{
"query": {
"term": {
"FIELD": {
"value": "VALUE"
}
}
}
}
多查詢條件 - terms
它可以使用多個查詢條件,並且可以跨索引查找
GET /_search
{
"query": {
"terms": {
"FIELD": [
"VALUE1",
"VALUE2"
]
}
}
}
範圍查詢 - range
範圍搜索可用於數組、日期
GET /_search
{
"query": {
"range": {
"FIELD": {
"gte": 10,
"lte": 20
}
}
}
}
存在與否查詢 - exists
返回在原始字段中至少有一個非空值的文檔:其實可以使用_field_names字段來查找
GET /_search
{
"query": {
"exists" : { "field" : "user" }
}
}
術語前綴匹配 - prefix
與查詢值前綴相同的術語都可以匹配
GET /_search
{
"query": {
"prefix": {
"FIELD": {
"value": ""
}
}
}
}
通配符查詢 - wildcard
查詢的內容可以使用統配符
GET /_search
{
"query": {
"wildcard": {
"FIELD": {
"value": "VALUE"
}
}
}
}
正則表達式查詢 - regexp
查詢詞可以使用正則
GET /_search
{
"query": {
"regexp": {
"FIELD": {
"value": "VALUE"
}
}
}
}
模糊查詢 - fuzzy
即相似詞查詢,其中fuzziness設置相似程度,prefix_length可以設置從什麼地方開始使用模糊匹配
GET /_search
{
"query": {
"fuzzy": {
"field": {
"value": "",
"fuzziness": 0.5,
"prefix_length": 0
}
}
}
}
類型搜索 - type
返回該類型下的所有數據
GET /_search
{
"query": {
"type" : {
"value" : "my_type"
}
}
}
主鍵查詢 - ids
返回指定id的文檔
GET /_search
{
"query": {
"ids" : {
"type" : "my_type",
"values" : ["1", "4", "100"]
}
}
}
複合查詢
複合查詢封裝了其他符合或簡單查詢,可以組合它們的結果和分數,改變它們的行爲。
常量分數查詢 - constant_score
它使查詢返回的文檔都有固定的分值,可以與沒有分值得過濾器配合使用
GET /_search
{
"query": {
"constant_score": {
"filter": {
},
"boost": 1.2
}
}
}
條件查詢 - bool
將幾個查詢的返回用布爾結果拼接
GET /_search
{
"query": {
"bool": {
"should": [ #不一定要滿足的條件 如果滿足加入評分
{
"term": {}
}
],
"must": [ #下面放必須滿足的查詢條件
{
"match": {}
},
{
"term": {}
}
],
"must_not": [ #存放要排除的內容
{
"term": {}
}
]
}
}
}
最佳字段分值解析 - dis_max
相比較bool的分值是總數計算,dis_max是使用最佳字段匹配模式的
GET /_search
{
"query": {
"dis_max": {
"tie_breaker": 0.7,
"boost": 1.2,
"queries": [ #這裏存放的搜索是使用or關聯的
{
"term": {}
}
]
}
}
}
分值函數計算查詢 - function_score
使用函數來重新計算查詢文檔的分值,需要有一個查詢,和一個或多個函數
GET /_search
{
"query": {
"function_score": {
"query": {},
"functions": [
{}
]
}
}
}
降低某些內容的評分 - boosting
相當於bool中的must和must_not,但不同的是此排除的內容是會加入到命中的,只是評分被降低了
GET /_search
{
"query": {
"boosting": {
"negative": { # 需要排除或者說降低評分的內容
},
"positive": { # 需要滿足的查詢
},
"negative_boost": 0.2 #降低的評分
}
}
}
多索引查詢 - indices
指定索引的查詢
GET /_search
{
"query": {
"indices": {
"indices": [
"INDEX1",
"INDEX2"
],
"query": {}
}
}
}
連接查詢
需要把個類型連接到一起進行查詢
嵌套查詢 - nested
對嵌套對象使用,可以查詢嵌套對象下面的內容
GET /_search
{
"query": {
"nested": {
"path": "nested", # 嵌套對象,下面使用nested.field
"query": {}
}
}
}
子類連接查詢 - has_child
將有相同子類的type連接到一起
GET /_search
{
"query": {
"has_child": {
"type": "child", # 子類型爲child的所以父類型參與搜索
"query": {}
}
}
}
關聯相同雙親 - has_parent
有相同父類型的子類型參與搜索,父子關係通過元數據_parent屬性指定
GET /_search
{
"query": {
"has_parent": {
"parent_type": "TYPE", #具有相同父類型的子類型參與搜索
"query": {}
}
}
}
父類id搜索 - parent_id
在父類型下根據id搜索文檔,其實相當於使用has_patent 然後對id進行查找,不過has_parent和has_child需要進行聯接,消耗比較大。此查詢性能高於前兩個
GET /my_index/_search
{
"query": {
"parent_id" : {
"type" : "blog_tag",
"id" : "1"
}
}
}
地理數據查詢
用於地理類型的查詢,字段類型爲geo_point或geo_shape
地理形狀查詢 - geo_shape
將地裏座標劃分成一個個網格,然後通過網格之間的關係進行匹配,可以是INTERSECTS(交叉),DISJOINT(不想交) ,WITHIN(在查詢內), CONTAINS (包含查詢)
邊界框搜索 - geo_bounding_box
通過兩個點確定一個長方形邊界框,來搜索在邊界框中的點
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_bounding_box" : {
"location" : {
"top_left" : { #左上角座標
"lat" : 40.73,
"lon" : -74.1
},
"bottom_right" : { #右下角座標
"lat" : 40.01,
"lon" : -71.12
}
}
}
}
}
}
}
距離搜索 - geo_distance
返回兩點距離在設定距離內的文檔
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "200km", #設置距離
"location" : { 查詢點
"lat" : 40,
"lon" : -70
}
}
}
}
}
}
距離範圍搜索 - geo_distance_range
返回兩點距離在範圍內的數據
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_distance_range" : {
"from" : "200km", #最小距離
"to" : "400km", #最大距離
"location" : { #查詢點
"lat" : 40,
"lon" : -70
}
}
}
}
}
}
多邊形查詢 - geo_polygon
使用點確定一個多邊形,返回圖形內的數據
GET /_search
{
"query": {
"bool" : {
"must" : {
"match_all" : {}
},
"filter" : {
"geo_polygon" : {
"location" : {
"points" : [ #根據點確定多邊形
{"lat" : 40, "lon" : -70},
{"lat" : 30, "lon" : -80},
{"lat" : 20, "lon" : -90}
]
}
}
}
}
}
}
相似搜索 - more_like_this
查看相似的文檔內容,像推薦系統就可以通過使用此查詢查找相似的內容。也可以
傳入文檔進行比較。
GET /_search
{
"query": {
"more_like_this": {
"fields": [
"FIELD"
],
"like_text": "text like this one",
"min_term_freq": 1,
"max_query_terms": 12
}
}
}
使用腳本查詢 - script
在查詢語句中使用腳本,一般用於過濾環境匯中。
GET /_search
{
"query": {
"bool" : {
"must" : {
"script" : {
"script" : {
"source": "doc['num1'].value > 1", #腳本語句
"lang": "painless"
}
}
}
}
}
}