《Elasticsearch: The Definitive Guide》讀書筆記2

##Routing a document to a shard shard = hash(routing) % number_of_primary_shards 經過散列函數,計算出document存儲的主分片,因此主分片數不能被修改。 routing默認是_id,也能夠自定義(傳參routing)。mysql

##creating,indexing,deleting a document 可選參數sql

  • replication 默認是sync,即同步寫入主分片後等待寫入副本分片成功後才返回。能夠設成async,異步寫入副本分片,不知道是否成功。不推薦async,容易因異步操做過多而使es過載(overload)。
  • consistency 默認主分片須要(主和副本分片中的)大多數分片正常運行(active),才能正常執行寫操做,這個值稱爲quorum。 quorum=int((primary + number_of_replicas)/2) + 1 例如,設置副本數是1,那麼至少須要2個節點,才能進行寫操做。 這個參數能夠設置 one(只要主分片),all(全部主副分片)或者默認的quorum。
  • timeout 若是副本分片不足,那麼es會等待更多的副本分片出現。默認等待1分鐘,這個參數能夠設置等待超時時間。

##retrieving a document數組

  • 接收請求的節點會輪流地(round-robin)把請求指向其餘擁有目標分片的節點,來達到負載均衡。
  • 一個可能的狀況是,當一個document正在索引(indexing),它會先寫到主分片,但副本分片尚未同步過去,這時把讀請求轉發給一個副本分片節點會返回數據不存在。

##searchingapp

  • GET /_search?timeout=10ms 這裏的timeout不會中止查詢的執行,而是告訴分片把到timeout爲止的數據返回並斷開鏈接,雖然分片已經返回結果可是在後臺分片可能仍然在處理查詢。負載均衡

  • GET /index1,index2/type1,type2/_search異步

  • 深分頁問題(deep paging) """ GET /_search?size=10&from=10000 """ 也就是搜索10條一頁,返回第10001到10010條數據,這時index的每一個分片都須要搜索top 10010條數據,而後合併排序再返回第10001到10010條數據,實際上另外的(number_of_primary_shards * 10010) - 10條數據都只是中間數據,只有10條數據是有效結果,因此搜索成本(cost)很大,應該儘可能避免這樣的查詢。async

  • _all Field 當索引一個document時,es會把全部的field的值鏈接起來組成一個大的字符串(big string),而後做爲_all的值,當查詢不指定field時,es會使用_all來查詢。函數

##分詞analysisfetch

  • 對一個string類型的field,es自動分詞

##mappingcode

  • field types

    • string
    • number:byte,short,integer,long
    • float,double
    • boolean
    • date
  • string mapping

    • index
      • analyzed:分詞、默認
      • not_analyzed:不分詞
      • no:不索引
    • analyzer 分詞器,默認standard analyzer
  • mapping在建立索引的時候指定 """ PUT /index { "mappings":{ "type_name":{ "properties":{ "field":{ "type":"string", "index":"not_analyzed" } } } } } """ mapping中已經存在的field不能被修改,但能夠新增field """ PUT /index/_mapping/type_name { "properties":{ "field_new":{ "type":"string", "index":"not_analyzed" } } } """

  • array 數組的元素的類型必須一致,es會以數組的第一個元素的類型做爲這個field的類型,數組是無序的。

  • Empty field

    • null,[],[null]
    • 空值的field不會被索引

##Query DSL

  • performance

    • query 找到匹配的document,並且計算相關度_score,不能被cache;用於全文搜索或須要計算相關度的地方。
    • filter 僅僅找到匹配的document,不計算相關度沒有_score,花費內存1 bit/doc,能夠被cache;用於任何不須要相關度的地方。
  • term filter 精確匹配field """ {"term":{"field":"value"}} """

  • terms filter 多值精確匹配field """ {"terms":{"field":["value1","value2","value3"]}} """

  • range,exists,missing,bool

  • match 可用於全文搜索,也可用於精確搜索。

  • 檢驗query """ GET /index/type/_validate/query?explain {...} """ explain參數,能夠返回錯誤緣由。

##排序

  • 默認按_score降序;其餘field默認升序

  • {"sort":{"date":{"order":"desc"}}}

  • 多值的field mode:min,max,avg,sum

  • 分詞與不分詞並存 """ "field":{ "type":"string", "analyzer":"english", "fields":{ "raw":{ "type":"string", "index":"not_analyzed" } } } """ 使用 field.raw

  • 對分詞的field排序會很是耗內存

  • 相關度計算 TF/IDF:在一個document的field中的詞頻/在index的文檔中出現的頻率

  • fielddata

    • 排序時,es加載整個index的全部document的values到內存,而不只僅是查詢到的document。
    • 主要用於
      • 一個field的排序
      • 對field的聚合
      • 固定數據集的過濾,好比geolocation filters
      • scripts that refer to fields
    • 很是耗內存,尤爲是具備不少不一樣值的field

##distributed search execution

  • 結果跳躍(bouncing results problem) 由於主從分片同步延遲,使從主分片讀和從副本分片讀的結果不同。 使用preference參數能夠控制從哪一個分片或者節點搜索。

  • timeout 指定等待分片返回結果的時間,若是超時,分片立刻返回已經搜索到的結果。

  • routing 指定分片路由

  • search_type

    • query_then_fetch 默認
    • count 獲取統計結果
    • query_and_fetch 僅用於單分片,query和fetch做爲一步操做
    • dfs_query_then_fetch,dfs_query_and_fetch 用於計算相關度
    • scan 與scroll API一塊兒使用,用於獲取大量數據,禁止排序
  • scan,scroll

    • 分批(batch)獲取數據,直到取完全部數據,不排序所以高效。
    • scroll:相似mysql的浮標cursor
    • 用法 """ GET /index/_search?search_type=scan&scroll=1m { "query":{"match_all":{}}, "size":1000 } """ 返回 _scroll_id:base-64 encoded string """ GET /_search/scroll?scroll=1m _scroll_id """
    • scroll=1m 這個過時時間每次請求都會刷新,因此只要足夠處理一批的數據就行。
    • 每批數據條數是 size * number_of_primary_shards
    • 每次請求scroll, 都會返回一個新的 _scroll_id, 下次請求須要帶上。
相關文章
相關標籤/搜索