<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 理解ElasticSearch緩存 <div style="text-indent:2em;"> <p>緩存對于已經配置好且正常工作的集群來說不過過多關注(這一條不僅適用于ElasticSearch)。緩存在ElasticSearch中扮演著重要的角色。通過緩存用戶可以高效地存儲過濾器的數據并且重復使用這些數據,比如高效地處理父子關系數據、faceting、對數據以索引中某個域來排序等等。在本節中,我們將詳細研究filter cache和field data cache這些最重要的緩存,而且我們將會意識到理解緩存的工作原理對于集群的調優非常重要。 </p> <h4>過濾器緩存</h4> <p>過濾器緩存是負責緩存查詢語句中過濾器的結果數據。比如,讓我們來看如下的查詢語句: <blockquote style="text-indent:2em;"> { "query" : { "filtered" : { "query" : { "match_all" : {} }, "filter" : { "term" : { "category" : "romance" } } } } } </blockquote> 執行該查詢語句將返回所有category域中含有term值為romcance的文檔。正如讀者如看到的那樣,我們將match_all查詢類型與過濾器結合使用。現在,執行一次查詢語句后,每個有同樣過濾條件的查詢語句都會重復使用緩存中的數據,從而節約了寶貴的I/O和CPU資源。 </p> <h4>過濾器緩存的類型</h4> <p>在ElasticSearch中過濾器緩存有兩種類型:索引級別和節點層面級別的緩存。所以基本上我們自己就可以配置過濾器緩存依賴于某個索引或者一個節點(節點是默認設置)。由于我們無法時時刻刻來猜測具體的某個索引會分配到哪個地方(實際上分配的是分片和分片副本),也就無法預測內存的使用,因此不建議使用基于索引的過濾器。 </p> <h4>index-level過濾器緩存的配置</h4> <p>ElasticSearch允許用戶使用如下的屬性來配置index-level過濾器緩存的行為: <ul> <li>index.cache.filter.type:該屬性用于指定緩存的類型,有resident,soft和weak,node(默認值)4個值可供選擇。對于resident類型的緩存,JVM無法刪除其中的緩存項,除非用戶來刪除(通過API,設置緩存的最大容量及失效時間都可以對緩存項進行刪除)。推薦使用該緩存類型(因為填充過濾器緩存開銷很大)。soft和weak類型的緩存能夠在內存不足時,由JVM自動清除。當JVM清理緩存時,其操作會根據緩存類型而有所不同。它會首先清理引用比較弱的緩存項,然后才會是使用軟引用的緩存項。node屬性表示緩存將在節點層面進行控制(參考本章的<i>Node-level過濾器緩存配置</i>一節的內容)</li> <li>index.cache.filter.max\_size: 該屬性指定了緩存可以存儲緩存項的數量(默認值是-1,表示數量沒有限制)。讀者需要記住,該設置項不適用于整個索引,只適用于索引分片上的一個段。所以緩存的內存使用量會因索引中分片(以及分片副本)的數量,還有索引中段的數量的不同而不同。通常情況下,默認沒有容量限制的緩存適用于soft類型和致力于緩存重用的特定查詢類型。 </li> <li>index.cache.filter.expire:該屬性指定了過濾器緩存中緩存項的失效時間,默認是永久不失效(所以其值設為-1)。如果希望一段時間類沒有命中的緩存項失效,緩存項沉寂的最大時間。比如,如果希望緩存項在60分鐘類沒有命中就失效,設置該屬性值為60m即可。 </li> </ul> </p> <!--note structure --> <div style="height:80px;width:650px;text-indent:0em;"> <div style="float:left;width:13px;height:100%; background:black;"> <img src="../lm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> <div style="float:left;width:50px;height:100%;position:relative;"> <img src="../note.png" style="position:absolute; top:30%; "/> </div> <div style="float:left; width:550px;height:100%;"> <p style="font-size:13px;margin-top:5px;">想了解更多關于軟引用和虛引用相關的內容,可以參考Java Document,特別是以下兩類:http://docs.oracle.com/javase/7/docs/api/java/lang/ref/SoftReference.html 和 http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html. </p> </div> <div style="float:left;width:13px;height:100%;background:black;"> <img src="../rm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> </div> <!-- end of note structure --> <h4>Node-level過濾器緩存的配置</h4> <p>讓緩存作用于節點上,是ElasticSearch默認和推薦的設置。對于特定節點的所有分片,該設置都已經默認生效(設置index.chache.filter.type屬性值為node,或者對此不作任何設置)。ElsticSearch允許用戶通過indices.cache.filter.size屬性來配置緩存的大小。用戶可以使用百分數,比如20%(默認設置)或者具體的值,比如1024mb來指定緩存的大小。如果使用百分數,那么ElasticSearch會基于節點的heap 內存值來計算出實際的大小。 </p> <p>node-level過濾器緩存是LRU類型的緩存(最近最少使用),即需要移除緩存項來為新的緩存項騰出位置時,最長時間沒有命中的緩存項將被移除。</p> <h4>域數據緩存</h4> <p>當查詢命令中用到faceting功能或者指定域排序功能時,域數據緩存就會用到。使用該緩存時,ElasticSearch所做的就是將指定域的所有取值加載到內存中,通過這一步,ElasticSearch就可以提供文檔域快速取值的功能。有兩點需要記住:直接從硬盤上讀取時,域的取值開銷很大,這是因為加載整個域的數據到內存不僅需要I/O操作,還需要CPU資源。 </p> <!--note structure --> <div style="height:80px;width:650px;text-indent:0em;"> <div style="float:left;width:13px;height:100%; background:black;"> <img src="../lm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> <div style="float:left;width:50px;height:100%;position:relative;"> <img src="../note.png" style="position:absolute; top:30%; "/> </div> <div style="float:left; width:550px;height:100%;"> <p style="font-size:13px;margin-top:5px;">讀者需要記住,對于每個用來進行faceting操作或者排序操作的域,域的所有取值都要加載到內存中:一個Term都不能放過。這個過程開銷很大,特別是對于基數比較大的域,這種域的term對象數目巨大。</p> </div> <div style="float:left;width:13px;height:100%;background:black;"> <img src="../rm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> </div> <!-- end of note structure --> <h4>index-level過濾器緩存的配置</h4> <p>與index-level過濾器緩存類似,我們也可以使用index-level域數據緩存,但是我們再說一次,不推薦使用index-level的緩存,原因還是一樣的:哪個分片或者哪個索引分配到哪個節點是很難預測的。因此我們也無法預測每個索引使用到的內存有多少,這樣容易出現內存溢出問題。 </p> <p>然而,如果用戶用戶熟知系統底層,熟知業務特點,了解resident和soft域數據緩存,可以將index.fielddata.cache.type屬性值為resident或者soft來啟用index-level的域數據緩存。在前面的過濾器緩存中已經有過描述,resident屬性的緩存無法由JVM自動移除,除非用戶介入。如果使用index-level域數據緩存,推薦使用resident類型。重建域數據緩存開銷巨大,而且會影響搜索性能。soft類型的域數據緩存可以在內存不足時由JVM自動移除。 </p> <h4>Node-level過濾器緩存的配置</h4> <p>ElasticSearch 0.90.0版本允許用戶使用使用如下屬性來設置node-level域數據緩存,如果用戶沒有修改配置,node-level域數據緩存是默認的類型。 <ul> <li>indices.fielddata.cache.size:該屬性有來指定域數據緩存的大小,可以使用百分數比如20%或者具體的數值,比如10gb。如果使用百分數,ElasticSearch會根據節點的最大堆內存值(heap memory)將百分數換算成具體的數值。默認情況下,域數據緩存的大小是沒有限制的。 </li> <li>indices.fielddata.cache.expire:該屬性用來設置域數據緩存中緩存項的失效時間,默認值是-1,表示緩存項不會失效。如果希望緩存項在指定時間內不命中就失效的話,可以設置緩存項沉寂的最大時間。比如,如果希望緩存項60分鐘內不命中就失效的話,就設置該屬性值為60m.</li> </ul> </p> <!--note structure --> <div style="height:80px;width:650px;text-indent:0em;"> <div style="float:left;width:13px;height:100%; background:black;"> <img src="../lm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> <div style="float:left;width:50px;height:100%;position:relative;"> <img src="../note.png" style="position:absolute; top:30%; "/> </div> <div style="float:left; width:550px;height:100%;"> <p style="font-size:13px;margin-top:5px;">如果想確保ElasticSearch應用node-level域數據緩存,用戶可以設置index.fielddata.cache.type屬性值為node,或者根本不設置該屬性的值即可。</p> </div> <div style="float:left;width:13px;height:100%;background:black;"> <img src="../rm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> </div> <!-- end of note structure --> <h4>域數據過濾</h4> <p>除了前面提到的配置項,ElasticSearch還允許用戶選擇域數據加載到域數據緩存中。這在一些場景中很有用,特別是用戶記得在排序和faceting時使用域緩存來計算結果。ElasticSearch允許用戶使用兩種類型過濾加載的域數據:通過詞頻,通過正則表達式,或者結合這兩者。</p> <p>樣例之一就是faceting功能:用戶可能想把頻率比較低的term排除在faceting的結果之外,這時,域數據過濾就很有用了。比如,我們知道在索引中有一些term有拼寫檢查的錯誤,當然這些term的基數都比較低。我們不想因此影響faceting功能的計算,因此只能從數據集中移除他們:要么從從數據源中更改過來,要么通過過濾器從域數據緩存中去除。通過過濾,不僅僅是從ElasticSearch返回的結果中排除了這些數據,同時降低了內存的占用,因為過濾后存儲在內存中的數據會更少。接下來了解一下過濾功能。</p> <h4>添加域數據過濾的信息</h4> <p>為了引入域數據過濾信息,我們需要在mappings域定義中添加額外的對象:fielddata對象以及它的子對象,filter。因此,以抽象的tag域為例,擴展后域的定義如下: <blockquote> "tag" : { "type" : "string", "index" : "not_analyzed", "fielddata" : { "filter" : { ... } } } </blockquote> 在接下來的一節中,我們將了解filter對象內部的秘密 </p> <h4>通過詞頻過濾</h4> <p>詞頻過濾功能允許用戶加載頻率高于指定最小值(min參數)并且低于指定最大值(max參數)的term。綁定到詞頻的min和max參數不是基于整個索引的,而是索引的每個段,這一點非常重要,因為不同的段詞頻會有不同。min和max參數可以設定成一個百分數(比如百分之一就是0.01,百分之五十就是0.5)或者設定為一個具體的數值。</p> <p>此外,用戶還可以設定min\_segment_size屬性值,用于指定一個段應該包含的最小文檔數。這構建域數據緩存時,低于該值的段將不考慮加載到緩存中。</p> <p>比如,如果我們只想把滿足如下條件的term加載到域數據緩存中:1、段中的文檔數不少于100;2、段中詞率在1%到20%之間。那么域就可以定義如下: <blockquote> { "book" : { "properties" : { "tag" : { "type" : "string", "index" : "not\_analyzed", "fielddata" : { "filter" : { "frequency" : { "min" : 0.01, "max" : 0.2, "min\_segment\_size" : 100 } } } } } } } </blockquote> </p> <h4>通過正則表達式過濾</h4> <p>除了可以通過詞頻過濾,還可以通過正則表達式過濾。比如有這樣的應用場景:只有符合正則表達式的term才可以加載到緩存中。比如,我們只想把tag域中可能是Twitter標簽(以#字符開頭)的term加載到緩存中,我們的mappings就應該定義如下: <blockquote> { "book" : { "properties" : { "tag" : { "type" : "string", "index" : "not\_analyzed", "fielddata" : { "filter" : { "regex" : "^\#.\*" } } } } } } </blockquote> </p> <h4>通過正則表達式和詞頻共同過濾</h4> <p>理所當然,我們可以將上述的兩種過濾方法結合使用。因此,如果我們希望域數據緩存中tag域中存儲滿足如下條件的數據: 1、以#字符開頭;2、段中至少有100個文檔;3、基于段的詞頻介于1%和20%之間,我們應該定義如下的mappings: <blockquote> { "book" : { "properties" : { "tag" : { "type" : "string", "index" : "not\_analyzed", "fielddata" : { "filter" : { "frequency" : { "min" : 0.1, "max" : 0.2, "min\_segment\_size" : 100 }, "regex" : "^#.*" } } } } } } </blockquote> </p> <!--note structure --> <div style="height:80px;width:650px;text-indent:0em;"> <div style="float:left;width:13px;height:100%; background:black;"> <img src="../lm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> <div style="float:left;width:50px;height:100%;position:relative;"> <img src="../note.png" style="position:absolute; top:30%; "/> </div> <div style="float:left; width:550px;height:100%;"> <p style="font-size:13px;margin-top:5px;">請記住域緩存不是在索引過程中構建的,因此可以在查詢過程中重新構建,基于此,我們可以在系統運行過程中通過mappingsAPI更新fielddata部分的設置,然面,讀者需要記住更新域數據加載過濾設置項后,緩存必須用相關的API清空。關于緩存清理API,可以在本章的<i>清空緩存</i>一節中了解到。</p> </div> <div style="float:left;width:13px;height:100%;background:black;"> <img src="../rm.png" height="70px" width="13px" style="margin-top:5px;"/> </div> </div> <!-- end of note structure --> <h4>過濾功能的一個例子</h4> <p>接下來我們回到過濾章節開頭的例子。我們希望排除faceting結果集中詞頻最低的term。在本例中,詞頻最低即頻率低于50%的term,當然這個頻率已經相當高了,只是我們的例子中只有4個文檔。在真實產品中,你可能需要將詞頻設置得更低。為了實現這一功能,我們用如下的命令創建一個books索引: <blockquote> curl -XPOST 'localhost:9200/books' -d '{ "settings" : { "number\_of\_shards" : 1, "number\_of\_replicas" : 0 }, "mappings" : { "book" : { "properties" : { "tag" : { "type" : "string", "index" : "not\_analyzed", "fielddata" : { "filter" : { "frequency" : { "min" : 0.5, "max" : 0.99 } } } } } } } }' </blockquote> 接下來,通過批處理API添加一些樣例文檔: <blockquote> curl -s -XPOST 'localhost:9200/\_bulk' --data-binary ' { "index": {"\_index": "books", "\_type": "book", "\_id": "1"}} {"tag":["one"]} { "index": {"\_index": "books", "\_type": "book", "\_id": "2"}} {"tag":["one"]} { "index": {"\_index": "books", "\_type": "book", "\_id": "3"}} {"tag":["one"]} { "index": {"\_index": "books", "\_type": "book", "\_id": "4"}} {"tag":["four"]} ' </blockquote> 接下來,運行一個查詢命令來檢測一個簡單的faceting功能(前面已經介紹了域數據緩存的操作方法): <blockquote>curl -XGET 'localhost:9200/books/_search?pretty' -d ' { "query" : { "match_all" : {} }, "facets" : { "tag" : { "terms" : { "field" : "tag" } } } }'</blockquote> 前面查詢語句的返回結果如下: <blockquote> { "took" : 2, "timed\_out" : false, "\_shards" : { "total" : 1, "successful" : 1, "failed" : 0 }, . . . "facets" : { "tag" : { "\_type" : "terms", "missing" : 1, "total" : 3, "other" : 0, "terms" : [ { "term" : "one", "count" : 3 } ] } } } </blockquote> 可以看到,term faceting功能只計算了值為one的term,值為four的term忽略了。如果我們假定值為four的term拼寫錯誤,那么我們的目的就達到了。 </p> <h4>緩存的清空</h4> <p>前面已經提到過,如果更改了域數據緩存的設置,在更新后清空緩存是至關重要的。同時,想更新一些用到確定緩存項的查詢語句,清除緩存功能也是很有用的。ElasticSearch允許用戶通過\_cache這個rest端點來清空緩存。該rest端點的使用方法隨后介紹。</p> <h4>單個索引、多個索引、整個集群緩存的清空</h4> <p>我們能做的最簡單的事就是通過如下的命令清空整個集群的緩存: <blockquote> curl -XPOST 'localhost:9200/\_cache/clear' </blockquote> 當然,我們也可以選擇清空一個或者多個索引的緩存。比如,如果想清空mastering索引的緩存,應該運行如下的命令: <blockquote> curl -XPOST 'localhost:9200/mastering/\_cache/clear' </blockquote> 同時,如果想清空mastering和books索引的緩存,應該運行如下的命令: <blockquote> curl -XPOST 'localhost:9200/mastering,books/\_cache/clear' </blockquote> </p> <h4>清除指定類型的緩存</h4> <p>除了前面提到的緩存清理方法,我們也可以只清理指定類型的緩存。可以清空如下類型的緩存: <ul> <li>filter:設置filter參數為true,該類型的緩存即可被清除。如果不希望此類型的緩存被清除,設置filter參數值為false即可。</li> <li>field\_data:設置field\_data參數值為true,該類型的緩存即可被清除。如果不希望此類型的緩存被清除,設置field\_data參數值為false即可。</li> <li>bloom:如果想清除bloom緩存(用于倒排表的布隆過濾器,在<i>第3章 索引底層控制</i>的<i>使用Codecs</i>一節中有介紹),bloom參數值應該設置為true。。如果不希望此類型的緩存被清除,設置bloom參數值為false即可</li> </ul> 例如,如果我們想清空mastering索引中的域數據緩存,同時保留過濾器緩存和沒有接觸到bloom緩存,運行如下的命令即可: <blockquote> curl -XPOST 'localhost:9200/mastering/\_cache/clear?field\_data=true&filter =false&bloom=false' </blockquote> </p> <h4>清除域相關的緩存</h4> <p>除了可以清空所有的緩存,以及指定的緩存,我們還可以清除指定域的緩存。為了實現這一功能,我們需要在請求命令中添加fields參數,參數值為我們想清空的域,多個域用逗號隔開。例如,如果我們想清空mastering索引中title域和price域的緩存,運行如下的命令即可: </p> <blockquote> curl -XPOST 'localhost:9200/mastering/\_cache/clear?fields=title,price' </blockquote> </div>
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看