elasticsearch.jpg
簡介
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)。