有幾個 查詢引數可以影響搜尋過程。 偏好
偏好這個引數preference
允許 用來控制由哪些分片或節點來處理搜尋請求。 它接受像_primary
,_primary_first
,_local
,_only_node:xyz
,_prefer_node:xyz
, 和_shards:2,3
這樣的值, 這些值在 /search-request-preference.html[searchpreference
] 文件頁面被詳細解釋。
但是最有用的值是某些隨機字串,它可以避免 bouncing results 問題。
bouncing results
想象一下有兩個文件有同樣值的時間戳字段,搜尋結果用timestamp
欄位來排序。 由於搜尋請求是在所有有效的分片副本間輪詢的,那就有可能發生主分片處理請求時,這兩個文件是一種順序, 而副本分片處理請求時又是另一種順序。
這就是所謂的 bouncing results 問題: 每次使用者重新整理頁面,搜尋結果表現是不同的順序。 讓同乙個使用者始終使用同乙個分片,這樣可以避免這種問題, 可以設定preference
引數為乙個特定的任意值比如使用者會話id來解決。
超時問題
通常分片處理完它所有的資料後再把結果返回給協同節點,協同節點把收到的所有結果合併為最終結果。
這意味著花費的時間是最慢分片的處理時間加結果合併的時間。如果有乙個節點有問題,就會導致所有的響應緩慢。
引數timeout
告訴 分片允許處理資料的最大時間。如果沒有足夠的時間處理所有資料,這個分片的結果可以是部分的,甚至是空資料。
搜尋的返回結果會用屬性timed_out
標明分片是否返回的是部分結果:
..."timed_out"
:true, (1)
...
這個搜尋請求超時了。
warning
超時仍然是乙個最有效的操作,知道這一點很重要; 很可能查詢會超過設定的超時時間。這種行為有兩個原因:
超時檢查是基於每文件做的。 但是某些查詢型別有大量的工作在文件評估之前需要完成。 這種 "setup" 階段並不考慮超時設定,所以太長的建立時間會導致超過超時時間的整體延遲。
因為時間檢查是基於每個文件的,一次長時間查詢在單個文件上執行並且在下個文件被評估之前不會超時。 這也意味著差的指令碼(比如帶無限迴圈的指令碼)將會永遠執行下去。
路由在 [routing-value] 中, 我們解釋過如何定製引數routing
,它能夠在索引時提供來確保相關的文件,比如屬於某個使用者的文件被儲存在某個分片上。 在搜尋的時候,不用搜尋索引的所有分片,而是通過指定幾個routing
值來限定只搜尋幾個相關的分片:
get/_search?routing=user_1,user2
這個技術在設計大規模搜尋系統時就會派上用場,我們在 [scale] 中詳細討論它。
搜尋型別
預設的搜尋型別是query_then_fetch
。 在某些情況下,你可能想明確設定search_type
為dfs_query_then_fetch
來改善相關性精確度:
get/_search?search_type=dfs_query_then_fetch
搜尋型別dfs_query_then_fetch
有預查詢階段,這個階段可以從所有相關分片獲取詞頻來計算全域性詞頻。 我們在 [relevance-is-broken] 會再討論它。
Elasticsearch 條件搜尋
es提供了兩種搜尋的方式 請求引數方式和請求體方式。請求引數方式 curl localhost 9200 bank search?q pretty 其中bank是查詢的索引名稱,q後面跟著搜尋的條件 q 表示查詢所有的內容 請求體方式 推薦這種方式 curl xpost localhost 9200...
Elasticsearch 深入搜尋
結構化搜尋 structured search 是指有關探詢那些具有內在結構資料的過程 在結構化查詢中,我們得到的結果 總是非是即否,要麼存於集合之中,要麼存在集合之外。結構化查詢不關心檔案的相關度或評分 它簡單的對文件包括或排除處理。當進行精確值查詢時,我們會使用過濾器 filters term ...
elasticsearch 搜尋方式
宣告 本文僅僅只是記個筆記 搜尋方式 took 耗費了幾毫秒 timed out 是否超時,這裡沒有 shareds 資料拆成1哥分片,所以對於搜尋請求,會打造所有的primary shard 或者是它的某個replica shard也可以 hits.total 查詢結果的數量,這裡有 3 個 do...