一個DSL例子
GET _search{
"query": {
"bool": {
"must": [
{ "match": { "name": "Jim" }},
{ "match": { "city": "Guangzhou" }}
],
"filter": [
{ "term": { "weight": "60" }},
{ "range": { "age": { "gte": "18" }}}
]
}
}
}
查詢的種類
Elasticsearch中的DSL主要由兩部分組成:
Leaf query Cluase 葉查詢子句:
這種查詢可以單獨使用,針對某一特定的字段查詢特定的值,比如match、term、range等
Compound query Cluase複合查詢子句:
這種查詢配合其他的葉查詢或者複合查詢,用於在邏輯上,組成更爲複雜的查詢,比如bool
Query與Filter
查詢在Query查詢上下文和Filter過濾器上下文中,執行的操作是不一樣的:
1、查詢上下文:是在使用query進行查詢時的執行環境,比如使用search的時候。
在查詢上下文中,查詢會回答這個問題——“這個文檔是否匹配這個查詢,它的相關度高麼?”
ES中索引的數據都會存儲一個_score分值,分值越高就代表越匹配。即使lucene使用倒排索引,對於某個搜索的分值計算還是需要一定的時間消耗。
2、過濾器上下文:在使用filter參數時候的執行環境,比如在bool查詢中使用Must_not或者filter
在過濾器上下文中,查詢會回答這個問題——“這個文檔是否匹配?”
它不會去計算任何分值,也不會關心返回的排序問題,因此效率會高一點。
另外,經常使用過濾器,ES會自動的緩存過濾器的內容,這對於查詢來說,會提高很多性能。
總而言之:
1 查詢上下文:查詢操作不僅僅會進行查詢,還會計算分值,用於確定相關度;
2 過濾器上下文:查詢操作僅判斷是否滿足查詢條件,不會計算得分,查詢的結果可以被緩存。
所以,根據實際的需求是否需要獲取得分,考慮性能因素,選擇不同的查詢子句。