本文參考官方提供api提煉出來的html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search.htmlgit
URI查詢github
elasticsearch能夠經過提供請求參數純粹使用URI來執行搜索請求。算法
GET twitter/_search?q=user:kimchy
名稱 | 描述 |
---|---|
|
查詢字符串(映射到 |
|
在查詢中未定義字段前綴時使用的默認字段。數組 |
|
分析查詢字符串時要使用的分析器名稱。app |
|
是否應分析通配符和前綴查詢。默認爲 |
|
應在協調節點上一次減小的分片結果數。若是請求中潛在的分片數量很大,則應將此值用做保護機制,以減小每一個搜索請求的內存開銷。 |
|
要使用的默認運算符能夠是 |
|
若是設置爲true將致使忽略基於格式的失敗(如向數字字段提供文本)。默認爲false。 |
|
對於每一個命中,包含如何計算命中得分的解釋。 |
|
設置爲 |
|
每一個匹配返回的文檔的選擇性存儲字段,逗號分隔。不指定任何值將致使沒有字段返回。 |
|
排序執行。能夠是 |
|
排序時,設置爲 |
|
設置爲 |
|
搜索超時,將搜索請求限制在指定的時間值內執行,並使用在到期時累積的點擊數進行保釋。默認爲無超時。 |
|
在達到查詢執行將提早終止時,爲每一個分片收集的最大文檔數。若是設置,響應將具備一個布爾字段, |
|
從命中的索引開始返回。默認爲 |
|
要返回的點擊次數。默認爲 |
|
要執行的搜索操做的類型。能夠是 |
|
|
Requet Body搜索
Requet Body請求能夠在其主體內使用包括查詢DSL的搜索DSL來執行。
GET /twitter/_search { "query" : { "term" : { "user" : "kimchy" } } }
|
搜索超時,將搜索請求限制在指定的時間值內執行,並使用在到期時累積的點擊數進行保釋。使用「 搜索取消」 編輯機制在達到超時後取消搜索請求。默認爲無超時。請參閱時間單位編輯。 |
|
從某個偏移量中檢索命中。默認爲 |
|
要返回的點擊次數。默認爲 |
|
要執行的搜索操做的類型。能夠是 |
|
設置爲 |
|
|
|
在達到查詢執行將提早終止時,爲每一個分片收集的最大文檔數。若是設置,響應將具備一個布爾字段, |
|
應在協調節點上一次減小的分片結果數。若是請求中潛在的分片數量很大,則應將此值用做保護機制,以減小每一個搜索請求的內存開銷。 |
Query
搜索請求主體中的查詢元素容許使用查詢DSL定義查詢。
GET /_search { "query" : { "term" : { "user" : "kimchy" } } }
From/Size
結果的分頁能夠經過使用from
和size
參數來完成。該from
參數定義要獲取的第一個結果的偏移量。該size
參數容許您配置要返回的最大命中數。
GET /_search { "from" : 0, "size" : 10, "query" : { "term" : { "user" : "kimchy" } } }
Sort
容許在特定字段上添加一個或多個排序。每種類型也能夠反轉。排序是在每一個字段級別定義的,具備用於_score
按分數排序的特殊字段名稱,以及_doc
按索引順序排序。
GET /my_index/_search { "sort" : [ { "post_date" : {"order" : "asc"}}, "user", { "name" : "desc" }, { "age" : "desc" }, "_score" ], "query" : { "term" : { "user" : "kimchy" } } }
在_score上排序時,順序默認爲desc,在排序其餘任何內容時默認爲asc
|
按升序排序 |
|
按降序排序 |
Elasticsearch支持按數組或多值字段進行排序。 mode選項控制選擇哪一個數組值以對其所屬的文檔進行排序。 mode選項能夠具備如下值
|
選擇最低值。 |
|
選擇最高價值。 |
|
使用全部值的總和做爲排序值。僅適用於基於數字的數組字段。 |
|
使用全部值的平均值做爲排序值。僅適用於基於數字的數組字段。 |
|
使用全部值的中位數做爲排序值。僅適用於基於數字的數組字段。 |
Elasticsearch還支持按一個或多個嵌套對象內的字段進行排序。 嵌套字段支持的排序具備嵌套排序選項,具備如下屬性:
path | 定義要排序的嵌套對象。實際排序字段必須是此嵌套對象中的直接字段。按嵌套字段排序時,此字段是必填字段。 |
filter | 嵌套路徑中的內部對象應與之匹配的過濾器,以便經過排序考慮其字段值。常見的狀況是在嵌套過濾器或查詢中重複查詢/過濾。默認狀況下,沒有nested_filter 活動。 |
nested | 與頂級相同,nested 但適用於當前嵌套對象中的另外一個嵌套路徑。 |
POST /_search { "query" : { "term" : { "product" : "chocolate" } }, "sort" : [ { "offer.price" : { "mode" : "avg", "order" : "asc", "nested": { "path": "offer", "filter": { "term" : { "offer.color" : "blue" } } } } } ] }
POST /_search { "query": { "nested": { "path": "parent", "query": { "bool": { "must": {"range": {"parent.age": {"gte": 21}}}, "filter": { "nested": { "path": "parent.child", "query": {"match": {"parent.child.name": "matt"}} } } } } } }, "sort" : [ { "parent.child.age" : { "mode" : "min", "order" : "asc", "nested": { "path": "parent", "filter": { "range": {"parent.age": {"gte": 21}} }, "nested": { "path": "parent.child", "filter": { "match": {"parent.child.name": "matt"} } } } } } ] }
Source過濾
容許控制_source
每次點擊返回字段的方式。
默認狀況下,_source
除非您使用了stored_fields
參數或_source
禁用了字段,不然操做將返回字段的內容。
您能夠_source
使用如下_source
參數關閉檢索:
要禁用_source
檢索設置爲false
:
GET /_search { "_source": false, "query" : { "term" : { "user" : "kimchy" } } }
GET /_search { "_source": { "includes": [ "obj1.*", "obj2.*" ], "excludes": [ "*.description" ] }, "query" : { "term" : { "user" : "kimchy" } } }
Script Fields
容許爲每一個匹配返回腳本評估(基於不一樣的字段)
GET /_search { "query" : { "match_all": {} }, "script_fields" : { "test1" : { "script" : { "lang": "painless", "source": "doc['price'].value * 2" } }, "test2" : { "script" : { "lang": "painless", "source": "doc['price'].value * params.factor", "params" : { "factor" : 2.0 } } } } }
腳本字段能夠處理未存儲的字段(my_field_name
在上面的例子中),並容許返回要返回的自定義值(腳本的評估值)。
Doc value Fields
GET /_search { "query" : { "match_all": {} }, "docvalue_fields" : [ { "field": "my_ip_field", "format": "use_field_mapping" }, { "field": "my_date_field", "format": "epoch_millis" } ] }
Post filter 後過濾器
在已經計算聚合以後,將post_filter
其應用於hits
搜索請求最末端的搜索。
GET /shirts/_search { "query": { "bool": { "filter": { "term": { "brand": "gucci" } } } }, "aggs": { "colors": { "terms": { "field": "color" } }, "color_red": { "filter": { "term": { "color": "red" } }, "aggs": { "models": { "terms": { "field": "model" } } } } }, "post_filter": { "term": { "color": "red" } } }
當你須要對搜索結果和聚合結果作不一樣的過濾時,你才應該使用 post_filter
, 有時用戶會在普通搜索使用 post_filter
。
不要這麼作! post_filter
的特性是在查詢 以後 執行,任何過濾對性能帶來的好處(好比緩存)都會徹底失去。
在咱們須要不一樣過濾時, post_filter
只與聚合一塊兒使用。
Rescoring
從新排序能夠經過使用輔助(一般更昂貴)算法從新排序由query
和和 post_filter
階段返回的頂部(例如100-500)文檔來提升精度 ,而不是將昂貴的算法應用於索引中的全部文檔。
甲rescore
它返回其結果,以經過處理總體搜索請求的節點進行排序以前請求是在每一個碎片執行。
目前,rescore API只有一個實現:查詢rescorer,它使用查詢來調整評分。
查詢rescorer僅對query
和和 post_filter
階段返回的Top-K結果執行第二個查詢。每一個分片上將檢查的文檔數量能夠經過window_size
參數控制,默認值爲10。
默認狀況下,原始查詢和rescore查詢的分數將線性組合,以生成_score
每一個文檔的最終結果。原始查詢和rescore查詢的相對重要性能夠 分別用query_weight
和控制rescore_query_weight
。二者都默認爲1
。
POST /_search { "query" : { "match" : { "message" : { "operator" : "or", "query" : "the quick brown" } } }, "rescore" : { "window_size" : 50, "query" : { "rescore_query" : { "match_phrase" : { "message" : { "query" : "the quick brown", "slop" : 2 } } }, "query_weight" : 0.7, "rescore_query_weight" : 1.2 } } }
分數模式 | 描述 |
---|---|
|
添加原始分數和rescore查詢分數。默認值。 |
|
將原始分數乘以rescore查詢分數。對 |
|
平均原始分數和rescore查詢分數。 |
|
取最大原始分數和rescore查詢分數。 |
|
取最小原始分數和rescore查詢分數。 |
Scroll
當search
請求返回結果的單個「頁面」時,scroll
API可用於從單個搜索請求中檢索大量結果(甚至全部結果),這與在傳統數據庫上使用遊標的方式很是類似。
scroll
不是針對實時用戶請求,而是針對處理大量數據,例如爲了將一個索引的內容從新索引到具備不一樣配置的新索引中。
POST /twitter/_search?scroll=1m { "size": 100, "query": { "match" : { "title" : "elasticsearch" } } }
POST /_search/scroll { "scroll" : "1m", "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" }
DELETE /_search/scroll { "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" }
DELETE /_search/scroll/_all
DELETE /_search/scroll/DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==,DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB
Multi Search API
多搜索API容許在同一API中執行多個搜索請求。它的端點是_msearch
。
請求的格式相似於批量API格式,並使用換行符分隔的JSON(NDJSON)格式。結構以下(若是特定搜索最終重定向到另外一個節點,則結構被特別優化以減小解析):
header \ n body \ n header \ n body \ n
GET twitter/_msearch {} {"query" : {"match_all" : {}}, "from" : 0, "size" : 10} {} {"query" : {"match_all" : {}}} {"index" : "twitter2"} {"query" : {"match_all" : {}}}
使用模板
GET _msearch/template {"index" : "twitter"} { "source" : "{ \"query\": { \"match\": { \"message\" : \"{{keywords}}\" } } } }", "params": { "query_type": "match", "keywords": "some message" } } {"index" : "twitter"} { "source" : "{ \"query\": { \"match_{{template}}\": {} } }", "params": { "template": "all" } }