Elasticsearch——search相關知識

  1. timeout機制node

    若是查詢咱們須要的全部數據時間很長,能夠先返回查詢到的一部分數據,就須要timeout機制。nginx

    timeout機制,指定每一個shard,只能在timeout時間範圍內,將搜索到的部分數據(也可能所有搜索到),直接返回給client程序,而不是等到全部的數據都搜索出來以後再返回。數據庫

    默認狀況下,沒有timeout機制。json

  1. 代碼示例網絡

    GET test_index/test_type/_search?timeout=10ms
    複製代碼
  1. 分頁搜索app

    語法:elasticsearch

    1GET test_index/test_type/_search?from=0&size=6
    複製代碼
  2. deep paging性能

    Elasticsearch 的分頁查詢在數據小於50000條仍是不錯的,默認每頁10條數據,也就是在5000頁之內,但時當數據超過50000條的話,就會出現深分頁問題,也就是 deep paging。spa

    舉個例子,總共有60000條數據,如今有3個primary shard,每一個shard上分20000條,每頁是10條數據,咱們要搜索第1000頁,實際上要拿到的是10001-10010,es會從3個shard上每一個都拿10010條數據,而後對着30030條數據排序,取第10001-10010條數據。code

    這樣當數據很大,搜索過深的時候,在協調節點即 cordinate node 上會保存大量的數據,而且還要進行排序,排序以後,再取出咱們須要的那一頁。這個過程,耗費網絡帶寬,內存和CPU,影響性能。

  3. 解決 deep paging 問題

    爲了解決上面的問題,elasticsearch提出了一個scroll滾動的方式,這個滾動的方式原理就是經過每次查詢後,返回一個scroll_id。根據這個scroll_id 進行下一頁的查詢。能夠把這個scroll_id理解爲一般關係型數據庫中的遊標。可是,這種scroll方式的缺點是不可以進行反覆查詢,也就是說,只能進行下一頁,不能進行上一頁。

  1. scroll 使用

    使用scoll滾動搜索,能夠先搜索一批數據,而後下次再搜索一批數據,以此類推,直到搜索出所有的數據來。

    scoll搜索會在第一次搜索的時候,保存一個當時的視圖快照,以後只會基於該舊的視圖快照提供數據搜索,若是這個期間數據變動,是不會讓用戶看到的
    採用基於_doc進行排序的方式,性能較高

    scoll,看起來挺像分頁的,可是其實使用場景不同。分頁主要是用來一頁一頁搜索,給用戶看的;scoll主要是用來一批一批檢索數據,讓系統進行處理的

    查詢示例:

    1GET test_index/test_type/_search?scroll=1m
    2{
    3  "query": {
    4    "match_all": {}
    5  },
    6  "size"3
    7}
    複製代碼

    查詢全部數據,一次返回三條數據,返回結果

     1{
    2  "_scroll_id""DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAEq3Fk13bkpoWFBFUWIyQ0VxR1hhM1Y0a2cAAAAAAABKuxZNd25KaFhQRVFiMkNFcUdYYTNWNGtnAAAAAAAASroWTXduSmhYUEVRYjJDRXFHWGEzVjRrZwAAAAAAAEq5Fk13bkpoWFBFUWIyQ0VxR1hhM1Y0a2cAAAAAAABKuBZNd25KaFhQRVFiMkNFcUdYYTNWNGtn",
    3  "took"0,
    4  "timed_out"false,
    5  "_shards": {
    6    "total"5,
    7    "successful"5,
    8    "skipped"0,
    9    "failed"0
    10  },
    11  "hits": {
    12    "total"9,
    13    "max_score"1,
    14    "hits": [
    15      {
    16        "_index""test_index",
    17        "_type""test_type",
    18        "_id""AWjxCRPzFjHDLA-cm71O",
    19        "_score"1,
    20        "_source": {
    21          "test_field""create id by es"
    22        }
    23      },
    24      {
    25        "_index""test_index",
    26        "_type""test_type",
    27        "_id""5",
    28        "_score"1,
    29        "_source": {
    30          "test_field""external client2 changed"
    31        }
    32      },
    33      {
    34        "_index""test_index",
    35        "_type""test_type",
    36        "_id""8",
    37        "_score"1,
    38        "_source": {
    39          "test_field""create id 6"
    40        }
    41      }
    42    ]
    43  }
    44}
    複製代碼

    得到的結果會有一個scoll_id,下一次再發送scoll請求的時候,必須帶上這個scoll_id

    1GET _search/scroll
    2{
    3  "scroll""1m",
    4  "scroll_id""DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAEs0Fk13bkpoWFBFUWIyQ0VxR1hhM1Y0a2cAAAAAAABLOBZNd25KaFhQRVFiMkNFcUdYYTNWNGtnAAAAAAAASzYWTXduSmhYUEVRYjJDRXFHWGEzVjRrZwAAAAAAAEs1Fk13bkpoWFBFUWIyQ0VxR1hhM1Y0a2cAAAAAAABLNxZNd25KaFhQRVFiMkNFcUdYYTNWNGtn"
    5}
    複製代碼
相關文章
相關標籤/搜索