Elasticsearch查詢

查詢

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"
                     }
                }
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章