Solr分布式搜索與索引分片

2018-01-15 11:35 更新

當(dāng)使用傳統(tǒng)索引分片時(shí),您需要考慮如何查詢文檔。

強(qiáng)烈建議您在需要擴(kuò)展或擴(kuò)展時(shí)使用SolrCloud。下面描述的設(shè)置是遺留的,并且在SolrCloud存在之前使用。SolrCloud提供了一個(gè)真正的分布式功能集,支持諸如自動(dòng)路由、leader選擇,開(kāi)放式并發(fā)和其他理想的分布式系統(tǒng)中所期望的健全性檢查。

本頁(yè)面上的所有內(nèi)容都是針對(duì)特定于分布式搜索的傳統(tǒng)設(shè)置。嘗試 SolrCloud 的用戶不應(yīng)遵循下面的任何步驟或信息。

更新重新排序(即副本A可能會(huì)看到更新X然后是Y,副本B可能會(huì)看到更新Y然后是X)。deleteByQuery也以相同的方式處理重新排序,以確保副本是一致的。碎片的所有副本都是一致的,即使這些更新在不同的副本上以不同的順序到達(dá)。

跨碎片分發(fā)文檔

當(dāng)不使用SolrCloud時(shí),您需要在服務(wù)器場(chǎng)的每個(gè)分片上獲取所有文檔的索引。Solr僅在SolrCloud模式下以其真實(shí)形式支持分布式索引(路由)。

在傳統(tǒng)分布式模式下,Solr不計(jì)算通用術(shù)語(yǔ)/文檔頻率。對(duì)于大多數(shù)大規(guī)模實(shí)施來(lái)說(shuō),Solr 在碎片級(jí)計(jì)算 TF/IDF 是不太可能的。但是,如果您的集合在服務(wù)器上的分布嚴(yán)重偏離,則可能會(huì)在搜索中發(fā)現(xiàn)具有誤導(dǎo)性的關(guān)聯(lián)結(jié)果。一般來(lái)說(shuō),最好是隨機(jī)分發(fā)文件到你的碎片。

使用shards參數(shù)執(zhí)行分布式搜索

如果查詢請(qǐng)求包含shards參數(shù),則Solr服務(wù)器將請(qǐng)求分布到作為參數(shù)列出的所有分片中。該shards參數(shù)使用以下語(yǔ)法:

host:port/base_url,host:port/base_url*

例如,下面的shards參數(shù)會(huì)導(dǎo)致搜索分布在兩個(gè)Solr服務(wù)器上:solr1和solr2,它們都在端口8983上運(yùn)行:

http://localhost:8983/solr/core1/select?shards=solr1:8983/solr/core1,solr2:8983/solr/core1&indent=true&q=ipod+solr

與其要求用戶顯式包含shards參數(shù),不如將此參數(shù)配置為 solrconfig. xml 的 RequestHandler 部分中的默認(rèn)值。

不要將shards參數(shù)添加到標(biāo)準(zhǔn)請(qǐng)求處理程序中;這樣做可能會(huì)導(dǎo)致搜索查詢進(jìn)入無(wú)限循環(huán)。相反,請(qǐng)定義一個(gè)使用該shards參數(shù)的新請(qǐng)求處理程序,并將分布式搜索請(qǐng)求傳遞給該處理程序。

使用傳統(tǒng)模式,只分布查詢請(qǐng)求。這包括使用支持分布式搜索的標(biāo)準(zhǔn)組件對(duì) SearchHandler (或從 org.apache.solr.handler.component.SearchHandler 擴(kuò)展的任何處理程序)的請(qǐng)求。

與SolrCloud模式一樣,當(dāng)shards.info=true時(shí),分布式響應(yīng)將包含關(guān)于分片的信息(每個(gè)分片表示邏輯上不同的索引或物理位置)

以下組件支持分布式搜索:

  • Query組件,它返回與查詢匹配的文檔
  • Facet組件,它處理facet.query和facet.field,其中facet是由count(默認(rèn)值)排序請(qǐng)求。
  • Highlighting組件,這使得Solr的包括“突出顯示”中的字段值匹配。
  • Stats組件,它返回 DocSet 中數(shù)值字段的簡(jiǎn)單統(tǒng)計(jì)
  • Debug組件,它有助于調(diào)試

分布式搜索的限制

在Solr中分布式搜索有以下限制:

  • 索引的每個(gè)文檔都必須有一個(gè)唯一的鍵。
  • 如果Solr發(fā)現(xiàn)重復(fù)的文檔ID,則Solr選擇第一個(gè)文檔并丟棄后續(xù)的文檔。
  • 如果在分布式搜索的第一階段和第二階段之間發(fā)生提交(commit),則分布式搜索的索引可能暫時(shí)不同步。這可能會(huì)導(dǎo)致這樣一種情況:與查詢匹配并隨后更改的文檔可能不再與查詢匹配,但仍將被檢索。但是,這種情況預(yù)計(jì)會(huì)非常罕見(jiàn),并且只能針對(duì)單個(gè)查詢請(qǐng)求。
  • 分片的數(shù)量受GET方法的URI允許的字符數(shù)限制;大多數(shù)Web服務(wù)器通常至少支持4000個(gè)字符,但許多服務(wù)器限制URI長(zhǎng)度以減少其遭受拒絕服務(wù)(DoS)攻擊的風(fēng)險(xiǎn)。
  • 通過(guò)在搜索請(qǐng)求中包含fl=id, [shard],可以在分布式搜索中返回每個(gè)文檔的分片信息。這將返回分片URL。
  • 在分布式搜索中,來(lái)自核心描述符的數(shù)據(jù)目錄將覆蓋 solrconfig. xml 中的任何數(shù)據(jù)目錄。
  • 更新命令可能被發(fā)送到正確配置分布式索引的任何服務(wù)器。文檔添加和刪除基于唯一文檔ID的哈希值被轉(zhuǎn)發(fā)到適當(dāng)?shù)膕erver/shard。commit命令和deleteByQuery命令被發(fā)送到每個(gè)shards的服務(wù)器中。

以前的一個(gè)限制是,TF/IDF相關(guān)性計(jì)算只使用分片本地統(tǒng)計(jì)。這仍然是默認(rèn)情況。如果您的數(shù)據(jù)不是隨機(jī)分布的,或者需要更精確的統(tǒng)計(jì)數(shù)據(jù),那么請(qǐng)記住配置ExactStatsCache。

通過(guò)分布式搜索避免分布式死鎖

就像在SolrCloud模式中一樣,inter-shard請(qǐng)求可能導(dǎo)致分布式死鎖,可以按照“分布式請(qǐng)求”一節(jié)中的說(shuō)明來(lái)避免 。

在兩臺(tái)本地服務(wù)器上測(cè)試索引分片

對(duì)于簡(jiǎn)單的功能測(cè)試,最簡(jiǎn)單的方法是在不同的端口上設(shè)置兩個(gè)本地Solr服務(wù)器。(當(dāng)然,在生產(chǎn)環(huán)境中,這些服務(wù)器將部署在不同的計(jì)算機(jī)上。)

  1. 制作兩個(gè)Solr主目錄并將solr.xml復(fù)制到新目錄中:
    mkdir example/nodes
    mkdir example/nodes/node1
    # Copy solr.xml into this solr.home
    cp server/solr/solr.xml example/nodes/node1/.
    # Repeat the above steps for the second node
    mkdir example/nodes/node2
    cp server/solr/solr.xml example/nodes/node2/.
  2. 啟動(dòng)兩個(gè)Solr實(shí)例:
    # Start first node on port 8983
    bin/solr start -s example/nodes/node1 -p 8983
    
    # Start second node on port 8984
    bin/solr start -s example/nodes/node2 -p 8984
  3. 使用sample_techproducts_configs在兩個(gè)節(jié)點(diǎn)上創(chuàng)建一個(gè)核心。
    bin/solr create_core -c core1 -p 8983 -d sample_techproducts_configs
    # Create a core on the Solr node running on port 8984
    bin/solr create_core -c core1 -p 8984 -d sample_techproducts_configs
  4. 在第三個(gè)窗口中,為每個(gè)服務(wù)器索引一個(gè)示例文檔:
    bin/post -c core1 example/exampledocs/monitor.xml -port 8983
    
    bin/post -c core1 example/exampledocs/monitor2.xml -port 8984
  5. 在端口8983上的節(jié)點(diǎn)上搜索:


    curl http://localhost:8983/solr/core1/select?q=*:*&wt=xml&indent=true
    這應(yīng)該帶回一個(gè)文件。在端口8984上的節(jié)點(diǎn)上搜索:
    curl http://localhost:8984/solr/core1/select?q=*:*&wt=xml&indent=true
    這也應(yīng)該帶回一個(gè)單一的文件?,F(xiàn)在使用瀏覽器或者curl.在兩臺(tái)服務(wù)器上進(jìn)行分布式搜索,在下面的例子中,傳遞一個(gè)額外的參數(shù)'fl'來(lái)將返回的字段限制為id和name。
    curl http://localhost:8983/solr/core1/select?q=*:*&indent=true&shards=localhost:8983/solr/core1,localhost:8984/solr/core1&fl=id,name
    這應(yīng)該包含兩個(gè)文件,如下所示:
    <response>
      <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">8</int>
        <lst name="params">
          <str name="q">*:*</str>
          <str name="shards">localhost:8983/solr/core1,localhost:8984/solr/core1</str>
          <str name="indent">true</str>
          <str name="fl">id,name</str>
          <str name="wt">xml</str>
        </lst>
      </lst>
      <result name="response" numFound="2" start="0" maxScore="1.0">
        <doc>
          <str name="id">3007WFP</str>
          <str name="name">Dell Widescreen UltraSharp 3007WFP</str>
        </doc>
        <doc>
          <str name="id">VA902B</str>
          <str name="name">ViewSonic VA902B - flat panel display - TFT - 19"</str>
        </doc>
      </result>
    </response>
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)