Solr結(jié)果集群

2018-11-29 15:50 更新

Solr 集群(或集群分析)插件嘗試自動發(fā)現(xiàn)相關(guān)的搜索命中(文檔)組,并將可讀的標簽分配給這些組。

默認情況下,在 Solr 中,集群算法被應用于每個查詢的搜索結(jié)果 - 這被稱為在線集群。雖然 Solr 包含全索引集群(離線集群)的擴展,但本節(jié)將重點討論在線集群。

為給定查詢發(fā)現(xiàn)的集群可以視為動態(tài)方面。如果定期分析比較困難(字段值不是事先知道的),或者查詢在本質(zhì)上是探索性的,這是有利的。查看 Carrot2 項目的演示頁面,查看搜索結(jié)果集群的實例(可視化中的組在右側(cè)搜索結(jié)果中自動發(fā)現(xiàn),沒有涉及外部信息)。

Solr集群

發(fā)給系統(tǒng)的查詢是 Solr。顯然,分面不能產(chǎn)生一組類似的組,盡管這兩種技術(shù)的目標是相似的 - 讓用戶瀏覽一組搜索結(jié)果,并重新調(diào)整查詢或?qū)⒔裹c縮小到當前文檔的一個子集。集群也類似于結(jié)果分組,因為它可以幫助更深入地查看搜索結(jié)果,超出前幾個點擊率。

集群概念

傳遞給集群組件的每個文檔都由幾個邏輯部分組成:

  • 唯一的標識符
  • 起源 URL
  • 標題
  • 主要內(nèi)容
  • 標題和內(nèi)容的語言代碼

標識符部分是必須的,其他所有部分都是可選的,但至少需要一個文本字段(標題或內(nèi)容)來使集群過程合理。重要的是要記住,邏輯文檔部分必須映??射到特定的架構(gòu)及其字段。集群的內(nèi)容(文本)可以來自存儲的文本字段或使用高亮過濾的上下文,所有這些選項將在配置部分進行說明。

一個集群算法是,在搜索結(jié)果中發(fā)現(xiàn)文檔之間的關(guān)系,并且形成可讀的集群標簽的實際邏輯 (實現(xiàn))。根據(jù)算法的選擇,集群可能會變化。Solr 提供了幾個在開源 Carrot2 項目中實現(xiàn)的算法,也有商業(yè)替代方案。

集群快速入門示例

Solr 附帶的 “techproducts” 示例已預先配置了所有必要的結(jié)果集群組件,但默認情況下它們是禁用的。

要啟用集群組件 contrib 和配置為使用它的專用搜索處理程序,請在運行示例時指定 JVM 系統(tǒng)屬性:

bin/solr start -e techproducts -Dsolr.clustering.enabled=true

您現(xiàn)在可以通過在瀏覽器中打開以下 URL 來嘗試集群處理程序:

http://localhost:8983/solr/techproducts/clustering?q=:&rows=100

輸出 XML 應包括搜索匹配和最后自動發(fā)現(xiàn)的集群的數(shù)組,類似于此處顯示的輸出:

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">299</int>
  </lst>
  <result name="response" numFound="32" start="0" maxScore="1.0">
    <doc>
      <str name="id">GB18030TEST</str>
      <str name="name">Test with some GB18030 encoded characters</str>
      <arr name="features">
        <str>No accents here</str>
        <str>這是一個功能</str>
        <str>This is a feature (translated)</str>
        <str>這份文件是很有光澤</str>
        <str>This document is very shiny (translated)</str>
      </arr>
      <float name="price">0.0</float>
      <str name="price_c">0,USD</str>
      <bool name="inStock">true</bool>
      <long name="_version_">1448955395025403904</long>
      <float name="score">1.0</float>
    </doc>

    <!-- more search hits, omitted -->
  </result>

  <arr name="clusters">
    <lst>
      <arr name="labels">
        <str>DDR</str>
      </arr>
      <double name="score">3.9599865057283354</double>
      <arr name="docs">
        <str>TWINX2048-3200PRO</str>
        <str>VS1GB400C3</str>
        <str>VDBDB1A16</str>
      </arr>
    </lst>
    <lst>
      <arr name="labels">
        <str>iPod</str>
      </arr>
      <double name="score">11.959228467119022</double>
      <arr name="docs">
        <str>F8V7067-APL-KIT</str>
        <str>IW-02</str>
        <str>MA147LL/A</str>
      </arr>
    </lst>

    <!-- More clusters here, omitted. -->

    <lst>
      <arr name="labels">
        <str>Other Topics</str>
      </arr>
      <double name="score">0.0</double>
      <bool name="other-topics">true</bool>
      <arr name="docs">
        <str>adata</str>
        <str>apple</str>
        <str>asus</str>
        <str>ati</str>
        <!-- other unassigned document IDs here -->
      </arr>
    </lst>
  </arr>
</response>

這個查詢(*:*)發(fā)現(xiàn)了幾個集群,將搜索命中分為各種類別:DDR、iPod、硬盤驅(qū)動器等。每個集群都有一個標簽和分數(shù),表示集群的“優(yōu)點”。分數(shù)是特定于算法的,并且僅在與同一集合中的其他集群的分數(shù)相關(guān)時才是有意義的。換言之,如果集群 A 比集群 B 具有更高的分數(shù),則集群 A 應該具有更好的質(zhì)量(具有更好的標簽和更連貫的文檔集)。每個群集都有一組屬于它的文檔的標識符數(shù)組。這些標識符對應于架構(gòu)中聲明的 uniqueKey 字段。

根據(jù)輸入文檔的質(zhì)量,一些集群可能沒有多大意義。有些文件可能被排除在外,根本就不會被集群;這些將被分配到合成的其他主題組,標記的 other-topics 屬性設置為 true(請參閱上面的XML 轉(zhuǎn)儲為例)。其他主題組的分數(shù)為零。

安裝集群 Contrib

集群 contrib 擴展需要 dist/solr-clustering-*.jar 和所有 contrib/clustering/lib 下的 JAR。

集群配置

集群搜索組件和請求處理程序的聲明

集群擴展是一個搜索組件,必須在 solrconfig.xml 中聲明。這樣一個組件可以作為鏈中的最后一個組件添加到請求處理程序中(因為它需要搜索結(jié)果,這些搜索結(jié)果必須先被搜索組件提?。?。

示例配置可能如下所示:

  1. 包括所需的 contrib JAR。請注意,默認路徑是相對于 Solr 核心的,所以他們可能需要調(diào)整您的配置,或明確的規(guī)格:$solr.install.dir。
    <lib dir="${solr.install.dir:../../..}/contrib/clustering/lib/" regex=".*\.jar" />
    <lib dir="${solr.install.dir:../../..}/dist/" regex="solr-clustering-\d.*\.jar" />
  2. 搜索組件的聲明。每個組件還可以聲明多個集群管道,可以通過傳遞 clustering.engine=(engine name)URL 參數(shù)在運行時選擇它們。
    <searchComponent name="clustering" class="solr.clustering.ClusteringComponent">
      <!-- Lingo clustering algorithm -->
      <lst name="engine">
        <str name="name">lingo</str>
        <str name="carrot.algorithm">org.carrot2.clustering.lingo.LingoClusteringAlgorithm</str>
      </lst>
    
      <!-- An example definition for the STC clustering algorithm. -->
      <lst name="engine">
        <str name="name">stc</str>
        <str name="carrot.algorithm">org.carrot2.clustering.stc.STCClusteringAlgorithm</str>
      </lst>
    </searchComponent>
  3. 一個請求處理程序,我們使用它附加上面聲明的集群組件。
    <requestHandler name="/clustering"
                    class="solr.SearchHandler">
      <lst name="defaults">
        <bool name="clustering">true</bool>
        <bool name="clustering.results">true</bool>
    
        <!-- Logical field to physical field mapping. -->
        <str name="carrot.url">id</str>
        <str name="carrot.title">doctitle</str>
        <str name="carrot.snippet">content</str>
    
        <!-- Configure any other request handler parameters. We will cluster the
             top 100 search results so bump up the 'rows' parameter. -->
        <str name="rows">100</str>
        <str name="fl">*,score</str>
      </lst>
    
      <!-- Append clustering at the end of the list of search components. -->
      <arr name="last-components">
        <str>clustering</str>
      </arr>
    </requestHandler>

集群組件的配置參數(shù)

以下每個集群工具或整個集群組件(取決于它們在哪里聲明)的下列參數(shù)都可用:

  • clustering 參數(shù)

    當值為true,表示集群組件已啟用。

  • clustering.engine 參數(shù)

    聲明使用哪個集群工具。如果不存在,則首先聲明將成為默認工具的工具。

  • clustering.results 參數(shù)

    當為true時,該組件將執(zhí)行搜索結(jié)果的集群(這應該被啟用)。

  • clustering.collection 參數(shù)

    當為true時,該組件將執(zhí)行整個文檔索引的集群(本節(jié)不包括全索引集群)。

在工具聲明級別,支持以下參數(shù):

  • carrot.algorithm 參數(shù)

    算法類。 

  • carrot.resourcesDir 參數(shù)

    特定于算法的資源和配置文件(停用詞、其他詞匯資源、默認設置)。默認指向conf/clustering/carrot2/

  • carrot.outputSubClusters 參數(shù)

    如果為true算法支持分級集群,子集群也將被發(fā)射。默認值:true。

  • carrot.numDescriptions 參數(shù)

    返回的每個集群標簽的最大數(shù)量(如果該算法將多個標簽分配給集群)。

該 carrot.algorithm 參數(shù)應包含由 Carrot2 框架所支持的算法的完全限定類名。目前,以下算法可用:

  • org.carrot2.clustering.lingo.LingoClusteringAlgorithm (開源)
  • org.carrot2.clustering.stc.STCClusteringAlgorithm (開源)
  • org.carrot2.clustering.kmeans.BisectingKMeansClusteringAlgorithm (開源)
  • com.carrotsearch.lingo3g.Lingo3GClusteringAlgorithm (商業(yè))

有關(guān)這些算法的特性比較,請參閱以下鏈接:

選擇哪種算法取決于流量(STC 比 Lingo 快,但可以說產(chǎn)生的直觀性較差,Lingo3G 是最快的算法,但不是免費的或開源的)、預期的結(jié)果(Lingo3G 提供了分層集群,Lingo 和 STC 提供不分層次的集群),以及輸入數(shù)據(jù)(每個算法將稍微不同地將輸入進行集群)。沒有人知道哪種算法是“最好的”。

上下文和全字段集群

集群工具可以將集群應用于(已存儲的)字段的全部內(nèi)容,或者可以在集群之前運行內(nèi)部高亮度傳遞來提取上下文片段。如果邏輯代碼段字段包含大量內(nèi)容(這會影響集群性能),建議使用高亮顯示。高亮顯示還可以提高集群的質(zhì)量,因為傳遞給算法的內(nèi)容將更關(guān)注于查詢(這將是查詢特定的上下文)。以下參數(shù)控制內(nèi)部高亮。

  • carrot.produceSummary 參數(shù)

    當為true時,集群組件將對指向carrot.titlecarrot.snippet的邏輯字段的內(nèi)容上運行高亮傳遞。否則,這些字段的全部內(nèi)容將被聚集。

  • carrot.fragSize 參數(shù)

    由高亮創(chuàng)建的片段的大?。ㄒ宰址麨榉枺?。如果沒有指定,將使用默認的高亮 fragsize(hl.fragsize)。

  • carrot.summarySnippets 參數(shù)

    要為集群生成的摘要片段的數(shù)量。如果未指定,則將使用默認突出顯示片段計數(shù)(hl.snippets)。

文檔字段映射的邏輯

正如“集群概念”中已經(jīng)提到的那樣,集群組件對由需要映射到存儲在 Solr 中的數(shù)據(jù)的物理架構(gòu)的由邏輯部分組成的“文檔”進行集群。字段映射屬性提供字段和邏輯文檔部分之間的連接。請注意,title 和 snippet 字段的內(nèi)容必須存儲,以便在搜索時可以檢索到它。

  • carrot.title 參數(shù)

    應該映射到邏輯文檔標題的字段(或者以逗號或空格分隔的字段列表)。與內(nèi)容(片段)相比,集群算法通常對標題字段的內(nèi)容給予更重的權(quán)重。為獲得最佳效果,該字段應包含簡潔、無噪音的內(nèi)容。如果數(shù)據(jù)中沒有明確的標題,則可以將此參數(shù)留空。

  • carrot.snippet 參數(shù)

    應該映射到邏輯文檔的主要內(nèi)容的字段(或以逗號或空格分隔的字段列表)。如果此映射指向非常大的內(nèi)容字段,則集群的性能可能會顯著下降。另一種方法是使用查詢上下文片段來進行集群,而不是使用完整的字段內(nèi)容。您可以參閱carrot.produceSummary參數(shù)說明來獲取更加詳細的信息。

  • carrot.url 參數(shù)

    應該映射到邏輯文檔的內(nèi)容URL的字段。如果不需要,留空白。

集群多語言內(nèi)容

字段映射規(guī)范可以包含一個 carrot.lang 參數(shù),該參數(shù)定義存儲寫入文檔的標題和內(nèi)容的語言的 ISO 639-1 代碼的字段。這個信息可以基于對文檔來源的先驗知識或者在索引時間應用的語言檢測過濾器而被存儲在索引中。Carrot2 框架內(nèi)的所有算法都將接受在 LanguageCode 枚舉中定義的語言的 ISO 代碼。

語言提示使集群算法可以更輕松地在輸入中分隔來自不同語言的文檔,并為集群選擇正確的語言資源。如果您確實有多語言查詢結(jié)果(或以不同于英語的語言查詢結(jié)果),強烈建議適當?shù)赜成湔Z言字段。

  • carrot.lang

    存儲文檔的文本字段的語言的 ISO 639-1 代碼的字段。

  • carrot.lcmap

    任意字符串映射到由carrot.lang使用的 ISO 639 雙字母代碼。該參數(shù)的語法與langid.map.lcmap相同,比如:

    langid.map.lcmap=japanese:ja polish:pl english:en

默認語言也可以使用 Carrot2 特定的算法屬性(在本例中為 MultilingualClustering.defaultLanguage 屬性)進行設置。

調(diào)整算法設置

Solr 附帶的算法正在使用它們的默認設置,這對于所有的數(shù)據(jù)集都是不夠的。所有算法都有詞匯資源和資源(停用詞,詞干,參數(shù)),可能需要調(diào)整以獲得更好的集群(和集群標簽)。對于基于 Carrot2 的算法,最好參考一個名為 Carrot2 Workbench(截圖如下)的專用調(diào)試應用程序。從這個應用程序中,您可以將一組算法屬性導出為一個 XML 文件,然后將其放置在由carrot.resourcesDir 指向的位置下。

  Solr集群

為集群提供默認值

在集群組件中聲明的所有引擎(算法)的默認屬性都放置在 carrot.resourcesDir 下,并具有預期的文件名:engineName-attributes.xml。因此,對于一個名為 lingo 的引擎和默認值carrot.resourcesDir,這些屬性會從 conf/clustering/carrot2/lingo-attributes.xml 的文件中讀取。

下面顯示了將文檔的默認語言更改為波蘭語的示例 XML 文件。

<attribute-sets default="attributes">
  <attribute-set id="attributes">
    <value-set>
      <label>attributes</label>
      <attribute key="MultilingualClustering.defaultLanguage">
        <value type="org.carrot2.core.LanguageCode" value="POLISH"/>
      </attribute>
    </value-set>
  </attribute-set>
</attribute-sets>

在查詢時調(diào)整算法

集群組件和 Carrot2 集群算法可以接受查詢時間屬性覆蓋。請注意,某些事情(例如詞匯資源)只能初始化一次(在啟動時,通過 XML 配置文件)。

為 Lingo 算法更改 LingoClusteringAlgorithm.desiredClusterCountBaseLingo 參數(shù)的示例查詢:

http://localhost:8983/solr/techproducts/clustering?q=:&rows=100&LingoClusteringAlgorithm.desiredClusterCountBase = 20

集群引擎(solrconfig.xml 聲明的算法)也可以在運行時通過傳遞 clustering.engine=namerequest 屬性來改變:

http://localhost:8983/solr/techproducts/clustering?q=:&rows=100&clustering.engine=kmeans

有關(guān)動態(tài)集群的性能注意事項

搜索結(jié)果的動態(tài)集群有兩個主要的性能損失:

  • 獲取大于平常數(shù)量的搜索結(jié)果(50、100或更多文檔)的成本增加
  • 集群本身的額外計算成本。

對于簡單的查詢,集群時間通常會占據(jù)獲取時間。如果文檔內(nèi)容很長,則存儲內(nèi)容的檢索可能成為瓶頸??梢酝ㄟ^以下幾種方式降低集群的性能影響:

  • 通過啟用 carrot.produceSummary 屬性,將較少的內(nèi)容反饋給集群算法。
  • 對所選字段(僅標題)執(zhí)行集群,使輸入變小。
  • 使用更快的算法(STC 代替 Lingo,Lingo3G 代替 STC),
  • 調(diào)整與特定算法直接相關(guān)的性能屬性。

其中一些技術(shù)在 Apache SOLR 和 Carrot2 集成策略文檔中進行了描述,可在:http://carrot2.github.io/solr-integration-strategies 上找到。Carrot2 手冊中還包含了提高性能的主題,網(wǎng)址為:http://doc.carrot2.org/#section.advanced-topics.fine-tuning.performance。

其他資源

以下資源提供了有關(guān) Solr 中的集群組件及其潛在應用程序的其他信息。

  • Apache Solr 和 Carrot2 集成策略:http://carrot2.github.io/solr-integration-strategies
  • Solr 搜索結(jié)果的集群和可視化:http://vimeo.com/26616444
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號