1. 程式人生 > >Elasticsearch 查詢與過濾

Elasticsearch 查詢與過濾

# 簡介 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