?DSL官方地址:
DSL查詢分類
Elasticsearch提供了基于JSON的DSL(https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl)來定義查詢。常見的查詢類型包括:
-
查詢所有:查詢出所有數據,一般測試用。例如:match_all
-
全文檢索(full text)查詢:利用分詞器對用戶輸入內容分詞,然后去倒排索引庫中匹配。例如:
-
match_query
-
multi_match_query
-
-
精確查詢:根據精確詞條值查找數據,一般是查找keyword、數值、日期、boolean等類型字段。例如:
-
ids
-
range
-
term
-
-
地理(geo)查詢:根據經緯度查詢。例如:
-
geo_distance
-
geo_bounding_box
-
-
復合(compound)查詢:復合查詢可以將上述各種查詢條件組合起來,合并查詢條件。例如:
-
bool
-
function_score
-
查詢所有
Query基本語法
?match查詢:全文檢索查詢的一種,會對用戶輸入內容分詞,然后去倒排索引庫檢索,語法:
GET /hotel/_search
{"query": {"match_all": {}}
}
全文檢索
GET /hotel/_search
{"query": {"match": {"all": "速8北京后海"}}
}
multi_match:與match查詢類似,只不過允許同時查詢多個字段
GET /hotel/_search
{"query": {"multi_match": {"query": "北京后海速8","fields": ["brand","name"]}}
}
這兩個比較 上面的 效率要高?
GET /hotel/_search
{
? "query": {
? ? "match": {
? ? ? "all": "速8北京后海"
? ? }
? }
}
GET /hotel/_search
{
? "query": {
? ? "multi_match": {
? ? ? "query": "北京后海速8",
? ? ? "fields": ["brand","name"]
? ? }
? }
}
精確查詢?
精確查詢一般是查找keyword、數值、日期、boolean等類型字段。所以不會對搜索條件分詞
term查詢?
# 精確查找
GET /hotel/_search
{"query":{"term": {"city": {"value": "北京"}}}}
區間查詢
?區間查詢 價格 100-200 gt:大于 ?lt:小于
區間查詢 價格 100-200 gte:大于等于 lte:小于等于
# 區間查詢 價格 100-200 gte:大于等于 lte:小于等于
GET /hotel/_search
{"query": {"range": {"price": {"gte": 100,"lte": 200}}}
}# 區間查詢 價格 100-200 gt:大于 lt:小于
GET /hotel/_search
{"query": {"range": {"price": {"gt": 1000,"lt": 2000}}}
}
地理查詢?
geo_distance 查詢?
# geo_distance 查詢
GET /hotel/_search
{"query": {"geo_distance":{"distance":"5km","location":"31.23462, 121.47327"}}
}
查詢附近的 15km 千米 46 家
查詢附近的 5km 千米 15 家
復合查詢
復合(compound)查詢:復合查詢可以將其它簡單查詢組合起來,實現更復雜的搜索邏輯。常見的有兩種:
-
function score:算分函數查詢,可以控制文檔相關性算分,控制文檔排名
-
bool query:布爾查詢,利用邏輯關系組合多個其它的查詢,實現復雜搜索
Function Score Query
使用 function score query,可以修改文檔的相關性算分(query score),根據新得到的算分排序。
測試案例?給“如家”這個品牌的酒店排名靠前一些
# function_score 查詢
GET /hotel/_search
{"query": {"function_score": {"query": {"match": {"all": "外灘"}},"functions": [{"filter": {"term": {"brand": "如家"}},"weight": 10}],"boost_mode": "sum"}}
}
function score query定義的三要素是
過濾條件:哪些文檔要加分
算分函數:如何計算function ?score
加權方式:function score 與 query score如何運算
復合查詢 Boolean Query
布爾查詢是一個或多個查詢子句的組合,每一個子句就是一個子查詢。子查詢的組合方式有:
-
must:必須匹配每個子查詢,類似“與”
-
should:選擇性匹配子查詢,類似“或”
-
must_not:必須不匹配,不參與算分,類似“非”
-
filter:必須匹配,不參與算分
語法示例
GET /hotel/_search
{"query": {"bool": {"must": [{"match": {"name": "如家"}}],"must_not": [{"range": {"price": {"gt": 400}}}],"filter": [{"geo_distance": {"distance": "10km","location": {"lat": 31.21,"lon": 121.5}}}]}}
}
must 里面會參與算分,參與字段越多 性能越差,如不需要算分的就移除到?filter 里面
搜索結果處理
排序
????????elasticsearch默認是根據相關度算分(_score)來排序,但是也支持自定義方式對搜索結果排序。可以排序字段類型有:keyword類型、數值類型、地理坐標類型、日期類型等
keyword、數值、日期類型排序的語法基本一致
普通排序
語句
# sort 排序 查詢
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"score": "desc"},{"price": "asc"}]
}
地理坐標排序
地理坐標 升序排序
# 安 地理坐標 升序排序
GET /hotel/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": {"lat": 31.034661,"lon": 121.612282},"order": "asc","unit": "km"}}]
}
分頁
基本的分頁
# 分頁
GET /hotel/_search
{"query": {"match_all": {}},"from": 10,"size": 5,"sort": [{"price": "desc"}]
}
深度分頁問題
高亮
語法
GET /hotel/_search
{"query": {"match": {"name": "如家"}},"highlight": {"fields": {"name": {}}}
}
GET /hotel/_search
{"query": {"match": {"all": "如家"}},"highlight": {"fields": {"name": {"require_field_match": "false"}}}
}