Elasticsearch 查詢與過濾
阿新 • • 發佈:2021-03-13
# 簡介
Elasticsearch 使用的查詢語言(DSL)擁有一套查詢元件,這些元件可以以無限組合的方式進行搭配。這套元件可以在以下兩種情況下使用:過濾上下文(filtering context)和查詢上下文(query context)。
# 說明
當使用於**過濾上下文**時,查詢被設定成一個“不評分”或者“過濾”查詢。即這個查詢只是簡單的問一個問題:“這篇文件是否匹配?”。回答也是非常的簡單,yes 或者 no ,二者必居其一。
典型用法
```
created 時間是否在 2013 與 2014 這個區間?
status 欄位是否包含 published 這個單詞?
lat_lon 欄位表示的位置是否在指定點的 10km 範圍內?
```
當使用於**查詢上下文**時,查詢就變成了一個“評分”的查詢。和不評分的查詢類似,也要去判斷這個文件是否匹配,同時它還需要判斷這個文件匹配的有 多好(匹配程度如何)。
# 效能差異
過濾查詢(Filtering queries)只是簡單的檢查包含或者排除,這就使得計算起來非常快。考慮到至少有一個過濾查詢(filtering query)的結果是 “稀少的”(很少匹配的文件),並且經常使用不評分查詢(non-scoring queries),結果會被快取到記憶體中以便快速讀取,所以有各種各樣的手段來優化查詢結果。
相反,評分查詢(scoring queries)不僅僅要找出匹配的文件,還要計算每個匹配文件的相關性,計算相關性使得它們比不評分查詢費力的多。同時,查詢結果並不快取。
# 語法
query的基礎語法
```
GET movies/_search
{
"query": {
"match": {
"title": {
"query": "beautiful"
}
}
}
}
```
filter的語法,一般跟著constant_score、bool
```
GET movies/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"title": "beautiful"
}
}
}
}
}
GET movies/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"title": "beautiful"
}
},
{
"range": {
"movieId": {
"gte": 94,
"lte": 1000
}
}
}
]
}
}
}
```
# 如何選擇查詢與過濾
通常的規則是,使用查詢(query)語句來進行**全文搜尋**或者其它任何需要影響**相關性得分**的搜尋。除此以外的情況都使用過濾(filters)。
# 資料
- https://www.elastic.co/guide/cn/elasticsearch/guide/current/_queries_and_filte