更新時間:2021年12月24日16時53分 來源:傳智教育 瀏覽次數(shù):
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括:
查詢所有:查詢出所有數(shù)據(jù),一般測試用。例如:match_all
全文檢索(full text)查詢:利用分詞器對用戶輸入內(nèi)容分詞,然后去倒排索引庫中匹配。例如:
精確查詢:根據(jù)精確詞條值查找數(shù)據(jù),一般是查找keyword、數(shù)值、日期、boolean等類型字段。例如:
地理(geo)查詢:根據(jù)經(jīng)緯度查詢。例如:
復(fù)合(compound)查詢:復(fù)合查詢可以將上述各種查詢條件組合起來,合并查詢條件。例如:
會對用戶輸入內(nèi)容分詞,常用于搜索框搜索:
①match查詢:全文檢索查詢的一種,會對用戶輸入內(nèi)容分詞,然后去倒排索引庫檢索,語法:
GET /indexName/_search { "query": { "match": { "FIELD": "TEXT" } } }
②multi_match:與match查詢類似,只不過允許同時查詢多個字段,語法:
GET /indexName/_search { "query": { "multi_match": { "query": "TEXT", "fields": ["FIELD1", " FIELD12"] } } }
精確查詢一般是查找keyword、數(shù)值、日期、boolean等類型字段。所以不會對搜索條件分詞。常見的有:
// term查詢 GET /indexName/_search { "query": { "term": { "FIELD": { "value": "VALUE" } } } }根據(jù)詞條精確匹配,一般搜索keyword類型、數(shù)值類型、布爾類型、日期類型字段
// range查詢 GET /indexName/_search { "query": { "range": { "FIELD": { "gte": 10, "lte": 20 } } } }
根據(jù)數(shù)值范圍查詢,可以是數(shù)值、日期的范圍
根據(jù)經(jīng)緯度查詢。常見的使用場景包括:
攜程:搜索我附近的酒店
滴滴:搜索我附近的出租車
微信:搜索我附近的人
根據(jù)經(jīng)緯度查詢,官方文檔。例如:
geo_bounding_box:查詢geo_point值落在某個矩形范圍的所有文檔
示例代碼如下:
// geo_bounding_box查詢 GET /indexName/_search { "query": { "geo_bounding_box": { "FIELD": { "top_left": { "lat": 31.1, "lon": 121.5 }, "bottom_right": { "lat": 30.9, "lon": 121.7 } } } } }
根據(jù)經(jīng)緯度查詢,官方文檔。例如:
geo_distance:查詢到指定中心點小于某個距離值的所有文檔
// geo_distance 查詢 GET /indexName/_search { "query": { "geo_distance": { "distance": "15km", "FIELD": "31.21,121.5" } } }
相關(guān)性算分
當(dāng)我們利用match查詢時,文檔結(jié)果會根據(jù)與搜索詞條的關(guān)聯(lián)度打分(_score),返回結(jié)果時按照分值降序列。例如,我們搜索 "虹橋如家",結(jié)果如下:
Function Score Query
使用 function score query,可以修改文檔的相關(guān)性算分(query score),根據(jù)新得到的算分排序。
把這個問題翻譯一下,function score需要的三要素:
GET /hotel/_search { "query": { "function_score": { "query": {// ... }, "functions": [ // 算分函數(shù) { "filter": { // 滿足的條件,品牌必須是如家 "term": { "brand": "如家" } }, "weight": 2 // 算分權(quán)重為2 } ], "boost_mode": "sum" } } }
布爾查詢是一個或多個查詢子句的組合。子查詢的組合方式有:
GET /hotel/_search { "query": { "bool": { "must": [ {"term": {"city": "上海" }} ], "should": [ {"term": {"brand": "皇冠假日" }}, {"term": {"brand": "華美達" }} ], "must_not": [ { "range": { "price": { "lte": 500 } }} ], "filter": [ { "range": {"score": { "gte": 45 } }} ] } } }
需求:搜索名字包含“如家”,價格不高于400,在坐標(biāo)31.21,121.5周圍10km范圍內(nèi)的酒店。