MoreLikeThis

MoreLikeThis 可以針對結果清單中與文件類似的文件啟用查詢。

它藉由使用原始文件中的詞彙來尋找索引中類似的文件來達成此目的。

有多種方式可以使用 MoreLikeThis。第一種也是最常見的方式是將其用作請求處理器。在這種情況下,您會根據需要將文字傳送到 MoreLikeThis 請求處理器(例如,當使用者按一下「類似文件」連結時)。

第二種是將其用作搜尋元件。這種方式較不理想,因為它會對每個符合使用者查詢的文件執行 MoreLikeThis 分析。這可能會降低搜尋結果的速度。

另一種方法是將其用作請求處理器,但使用外部提供的文字。這種情況也稱為 MoreLikeThisHandler,會根據輸入文件的文字,提供索引中類似文件的相關資訊。

最後,可以使用 MLT 查詢剖析器。它的運作方式與請求處理器大致相同,但由於它是查詢剖析器,因此可以用於篩選查詢、增強查詢等,而且可以根據需要分頁或醒目提示結果。

MoreLikeThis 的運作方式

MoreLikeThis 會根據文件中的詞彙建立 Lucene 查詢。它藉由從請求提供的欄位清單中提取詞彙來執行此操作。

為了獲得最佳結果,欄位應儲存詞彙向量 (termVectors=true),這可以在schema 中設定。如果未儲存詞彙向量,MoreLikeThis 可以從儲存的欄位產生詞彙。為了使 MoreLikeThis 正常運作,用於 uniqueKey 的欄位也必須儲存。

原始文件中擷取的詞彙會使用 MoreLikeThis 參數定義的閾值進行篩選。一旦選定詞彙,就會執行查詢,並適當加入任何其他查詢參數,然後傳回新的文件集。

MoreLikeThis 處理器與元件

MoreLikeThis 請求處理器和搜尋元件共用幾個參數,但在回應和操作方面也存在一些關鍵差異,如下所述。

共用處理器與元件參數

以下列表概述了 Solr 支援的 MoreLikeThis 參數。這些參數可用於 MoreLikeThis 搜尋元件或請求處理器。

mlt.fl

必要

預設值:無

指定用於相似度的欄位。可以提供以逗號分隔的欄位清單。如果可能,這些欄位應儲存 termVectors

mlt.mintf

選用

預設值:2

指定在來源文件中忽略詞彙的最低頻率。

mlt.mindf

選用

預設值:5

指定在至少未出現在這麼多文件中的情況下,忽略詞彙的最低頻率。

mlt.maxdf

選用

預設值:無

指定在超過此數量的文件中出現的情況下,忽略詞彙的最高頻率。

mlt.maxdfpct

選用

預設值:無

使用與索引中文件數量相關的比率,指定最高文件頻率。提供的值必須是介於 0100 之間的整數。例如,mlt.maxdfpct=75 表示如果某個字詞在索引中超過 75% 的文件中出現,則會被忽略。

mlt.minwl

選用

預設值:無

設定忽略詞彙的最低字詞長度。

mlt.maxwl

選用

預設值:無

設定忽略詞彙的最高字詞長度。

mlt.maxqt

選用

預設值:25

設定任何產生查詢中包含的最高查詢詞彙數量。

mlt.maxntp

選用

預設值:5000

設定在每個未透過 TermVector 支援儲存的範例文件欄位中剖析的最大權杖數量。

mlt.boost

選用

預設值:false

指定查詢是否將依據感興趣的詞彙相關性提升。可能的值為 truefalse

mlt.qf

選用

預設值:無

使用與 DisMax 查詢剖析器相同的格式,查詢欄位及其提升。這些欄位也必須在 mlt.fl 中指定。

mlt.interestingTerms

選用

預設值:none

在回應中新增一個區段,顯示用於 MoreLikeThis 查詢的最熱門詞彙(基於 TF/IDF)。它支援三個可能的值

  • list 列出詞彙。

  • none 不列出詞彙(預設值)。

  • details 列出詞彙以及每個詞彙使用的提升值。除非 mlt.boost=true,否則所有詞彙都會有 boost=1.0

若要將此參數與搜尋元件搭配使用,則查詢不能分散。為了取得感興趣的詞彙,查詢必須傳送到單一分片,並僅限於該分片(使用 shards 參數)。不過,MoreLikeThis 請求處理器支援多分片。

MoreLikeThis 請求處理器

請求處理器組態

MoreLikeThis 請求處理器預設未設定,需要先進行設定才能使用。您可以透過手動編輯 solrconfig.xml 或使用 Config API 來執行此操作

  • 手動設定

  • Config API

<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">
  <str name="mlt.fl">body</str>
</requestHandler>
curl -X POST -H 'Content-type:application/json' -d {
  "add-requesthandler": {
    "name": "/mlt",
    "class": "solr.MoreLikeThisHandler",
    "defaults": {"mlt.fl": "body"}
  }
} https://127.0.0.1:8983/solr/<collection>/config

以上兩個範例都會將請求處理器的 mlt.fl 參數設定為「body」。這表示對處理器的所有請求都會使用該參數的值,除非在個別請求中明確覆寫。

如需一般請求處理器設定的詳細資訊,請參閱預設元件一節。

請求處理器參數

除了上述的共用參數之外,MoreLikeThis 請求處理器還支援以下參數。它使用一般查詢參數支援刻面、分頁和篩選,但不適用於替代查詢剖析器。

mlt.match.include

選用

預設值:true

指定回應是否應包含相符的文件。如果設定為 false,回應會看起來像一般選取回應。

mlt.match.offset

選用

預設值:無

指定主查詢搜尋結果中的偏移,以找到應在其上執行 MoreLikeThis 查詢的文件。預設情況下,查詢會針對 q 參數的第一個結果執行。

請求處理器查詢與回應

對 MoreLikeThis 請求處理器的查詢會使用設定時定義的名稱(在上述範例中為 /mlt)。

以下範例查詢會使用 Solr 範例文件集 (./example/exampledocs) 中找到的文件 (q=id:0553573403),並要求使用作者欄位來尋找類似的文件 (mlt.fl=author)。

https://127.0.0.1:8983/solr/gettingstarted/mlt?mlt.fl=author&mlt.interestingTerms=details&mlt.match.include=true&mlt.mindf=0&mlt.mintf=0&q=id%3A0553573403

此查詢也會要求感興趣的詞彙及其提升 (mlt.interestingTerms=details),以及也傳回原始文件 (mlt.match.include=true)。最低詞彙頻率和最低詞彙文件頻率設定為 0

回應將包含一個 match 區段,其中包含原始文件。response 區段包含類似的文件。最後,interestingTerms 區段會顯示來自作者欄位,用於尋找類似文件的詞彙。因為我們沒有同時指定 mlt.boost,所以顯示的感興趣詞彙的提升值全都會顯示 1.0

{
  "match":{"numFound":1,"start":0,"numFoundExact":true,
    "docs":[
      {
        "id":"0553573403",
        "cat":["book"],
        "name":["A Game of Thrones"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":1,
        "genre_s":"fantasy",
        "_version_":1693062911089442816}]
  },
  "response":{"numFound":2,"start":0,"numFoundExact":true,
    "docs":[
      {
        "id":"0553579908",
        "cat":["book"],
        "name":["A Clash of Kings"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":2,
        "genre_s":"fantasy",
        "_version_":1693062911094685696},
      {
        "id":"055357342X",
        "cat":["book"],
        "name":["A Storm of Swords"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":3,
        "genre_s":"fantasy",
        "_version_":1693062911095734272}]
  },
  "interestingTerms":[
    "author:r.r",1.0,
    "author:george",1.0,
    "author:martin",1.0]}

如果我們沒有要求 mlt.match.include=true,則回應不會包含 match 區段。

將外部內容串流至 MoreLikeThis

外部文件(索引中沒有的文件)可以傳遞至 MoreLikeThis 請求處理器,以用於建議的文件。

這可以透過使用內容串流來完成。文件的主體可以使用 stream.body 參數直接傳遞至請求處理器。或者,如果啟用遠端串流,則可以傳遞 URL 或檔案。

https://127.0.0.1:8983/solr/mlt?stream.body=electronics%20memory&mlt.fl=manu,cat&mlt.interestingTerms=list&mlt.mintf=0

此查詢會將詞彙「electronics memory」傳遞至請求處理器,而不是使用索引中已有的文件。

在這種情況下,回應會看起來與上面使用索引中已有的文件的回應類似。注意:這不適用於 SolrCloud,請查看下方的可能解決方案。

MoreLikeThis 搜尋元件

將 MoreLikeThis 當作搜尋元件使用,會針對另一個查詢的回應集中每個文件,傳回類似的文件。請務必注意,這可能會造成搜尋效能的成本,因此只有在用例保證的情況下才應使用。

搜尋元件設定

MoreLikeThis 搜尋元件是與所有搜尋處理器搭配運作的預設搜尋元件(另請參閱 預設元件)。

由於已設定,因此不需要其他設定,除非您想要為特定集合設定覆寫 MoreLikeThis 預設值的參數。若要執行此操作,您可以像這樣設定它

<searchComponent name="mlt" class="solr.MoreLikeThisComponent">
    <str name="mlt">true</str>
    <str name="mlt.fl">body</str>
</searchComponent>

上述範例永遠會針對所有查詢啟用 MoreLikeThis,並且永遠會使用「body」欄位。這可能不是您真正想要的!但此範例的作用是顯示您可能如何為 MoreLikeThis 定義任何您想要預設的參數。

如果您為搜尋元件提供「mlt」以外的名稱,如上述範例所示,則需要明確將其新增至請求處理器,如參考搜尋元件一節所述。因為上述範例使用與預設值相同的名稱,所以定義的參數會覆寫 Solr 的預設值。

搜尋元件參數

除了上述的共用參數之外,MoreLikeThis 搜尋元件還支援以下參數。

mlt

選用

預設值:無

如果設定為 true,則會啟動 MoreLikeThis 元件,並讓 Solr 傳回 MoreLikeThis 結果。

mlt.count

選用

預設值:5

指定要為每個結果傳回的類似文件數量。

搜尋元件查詢與回應

使用 MoreLikeThis 作為搜尋元件時的回應,與使用請求處理器時的回應不同。

在這種情況下,我們使用 /select 請求處理器,並執行一般查詢 (q=author:martin)。我們已要求將 MoreLikeThis 新增至回應 (mlt=true),但參數與先前的範例相同(我們要求感興趣的詞彙,並將最低詞彙和文件頻率設定為 0)。

https://127.0.0.1:8983/solr/gettingstarted/select?mlt.fl=name&mlt.mindf=0&mlt.mintf=0&mlt=true&q=author%3Amartin

回應包含我們查詢的結果,在此案例中為 3 個在作者欄位中具有詞彙「martin」的文件。不過,我們已變更欄位,根據 name 欄位中的值,找到與這些欄位類似的文件 (mlt.fl=name)。

在回應中,已新增 moreLikeThis 區段。針對符合我們查詢結果中的每個文件,會傳回一份文件 ID 清單和分數值。這些文件中的每一個都與結果清單中的文件具有不同程度的相似度。

{
  "response":{"numFound":3,"start":0,"maxScore":0.43659902,"numFoundExact":true,  "docs":[
      {
        "id":"0553573403",
        "cat":["book"],
        "name":["A Game of Thrones"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":1,
        "genre_s":"fantasy",
        "_version_":1693062911089442816},
      {
        "id":"0553579908",
        "cat":["book"],
        "name":["A Clash of Kings"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":2,
        "genre_s":"fantasy",
        "_version_":1693062911094685696},
      {
        "id":"055357342X",
        "cat":["book"],
        "name":["A Storm of Swords"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":3,
        "genre_s":"fantasy",
        "_version_":1693062911095734272}]
  },
  "moreLikeThis":[
    "0553573403",{"numFound":6,"start":0,"maxScore":1.6554483,"numFoundExact":true,
      "docs":[
        {
          "id":"055357342X",
          "score":1.6554483},
        {
          "id":"0553579908",
          "score":1.6554483},
        {
          "id":"0805080481",
          "score":1.3422124},
        {
          "id":"0812550706",
          "score":1.284826},
        {
          "id":"978-1423103349",
          "score":0.7652973}]
    },
    "0553579908",{"numFound":5,"start":0,"maxScore":1.6554483,"numFoundExact":true,
      "docs":[
        {
          "id":"055357342X",
          "score":1.6554483},
        {
          "id":"0553573403",
          "score":1.6554483},
        {
          "id":"0805080481",
          "score":1.3422124},
        {
          "id":"978-1423103349",
          "score":0.7652973},
        {
          "id":"VDBDB1A16",
          "score":0.68205893}]
    },
    "055357342X",{"numFound":5,"start":0,"maxScore":1.6554483,"numFoundExact":true,
      "docs":[
        {
          "id":"0553579908",
          "score":1.6554483},
        {
          "id":"0553573403",
          "score":1.6554483},
        {
          "id":"0805080481",
          "score":1.3422124},
        {
          "id":"978-1423103349",
          "score":0.7652973},
        {
          "id":"VDBDB1A16",
          "score":0.68205893}]
    }]}

MoreLikeThis 查詢剖析器

mlt 查詢剖析器提供一種機制,可擷取類似於特定文件的文件,如請求處理器所示。

它使用 Lucene 現有的 MoreLikeThis 邏輯,並且也適用於 SolrCloud 模式。此處使用的文件識別碼是文件的 uniqueKey 值,而不是 Lucene 內部文件 ID。傳回的文件清單不包含查詢的文件。

查詢剖析器的其中一個好處是它可以應用於各種位置,而不僅限於標準 q 參數。這讓 MoreLikeThis 可以新增至提升查詢、篩選查詢、函式查詢等。

查詢剖析器參數

此查詢剖析器採用下列參數

qf

必要

預設值:無

定義用作相似度分析基礎的欄位。

mintf

選用

預設值:2

定義在來源文件中忽略詞彙的最低頻率。

mindf

選用

預設值:5

定義在至少未出現在這麼多文件中的情況下,忽略詞彙的最低頻率。

maxdf

選用

預設值:無

設定在超過此數量的文件中出現的情況下,忽略詞彙的最高頻率。

minwl

選用

預設值:無

設定忽略詞彙的最低字詞長度。

maxwl

選用

預設值:無

設定忽略詞彙的最高字詞長度。

maxqt

選用

預設值:25

設定任何產生查詢中包含的最高查詢詞彙數量。

maxntp

選用

預設值:5000

設定在每個未透過 TermVector 支援儲存的範例文件欄位中剖析的最大權杖數量。

boost

選用

預設值:false

指定查詢是否將依據感興趣的詞彙相關性提升。它可以是 truefalse

查詢剖析器查詢與回應

MoreLikeThis 查詢剖析器請求的結構類似於使用 本機參數>的查詢,例如

{!mlt qf=name}1

這會使用 MoreLikeThis 查詢剖析器,根據「name」欄位,尋找類似於文件「1」的文件。

額外的參數會被加入括號內,例如,如果我們想要為 mintfmindf 指定限制。

{!mlt qf=name mintf=2 mindf=3}1

如果給定一個查詢,像是基於 Solr 提供的範例文件:

https://127.0.0.1:8983/solr/gettingstarted/select?q={!mlt qf=author mintf=1 mindf=1}0553573403

查詢解析器的回應只包含依分數排序的相似文件。

{
  "response":{"numFound":2,"start":0,"maxScore":1.309797,"numFoundExact":true,
    "docs":[
      {
        "id":"0553579908",
        "cat":["book"],
        "name":["A Clash of Kings"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":2,
        "genre_s":"fantasy",
        "_version_":1693062911094685696},
      {
        "id":"055357342X",
        "cat":["book"],
        "name":["A Storm of Swords"],
        "price":[7.99],
        "inStock":[true],
        "author":["George R.R. Martin"],
        "series_t":"A Song of Ice and Fire",
        "sequence_i":3,
        "genre_s":"fantasy",
        "_version_":1693062911095734272}]
  }}

外部內容的查詢解析器

使用 {!mlt_content}lorem ipsum{!mlt_content q='lorem ipsum'} 來尋找與 SolrCloud 模式中索引內沒有的外部內容相似的文件,如同 /mlt 處理器和內容串流。參數和回應與上述相同。它會使用給定的內容查詢透過 qf 參數傳遞的欄位。當省略 qf 時,它會查詢 schema 中的所有欄位,這通常會在數值和其他特定格式的欄位類型上失敗。如果您需要使用不同的內容查詢不同的欄位,請將數個 {!mlt_content qf=fieldA}lorem ipsum{!bool} 查詢或其他方式結合使用。