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
-
選用
預設值:無
使用與索引中文件數量相關的比率,指定最高文件頻率。提供的值必須是介於
0
和100
之間的整數。例如,mlt.maxdfpct=75
表示如果某個字詞在索引中超過 75% 的文件中出現,則會被忽略。 mlt.minwl
-
選用
預設值:無
設定忽略詞彙的最低字詞長度。
mlt.maxwl
-
選用
預設值:無
設定忽略詞彙的最高字詞長度。
mlt.maxqt
-
選用
預設值:
25
設定任何產生查詢中包含的最高查詢詞彙數量。
mlt.maxntp
-
選用
預設值:
5000
設定在每個未透過 TermVector 支援儲存的範例文件欄位中剖析的最大權杖數量。
mlt.boost
-
選用
預設值:
false
指定查詢是否將依據感興趣的詞彙相關性提升。可能的值為
true
或false
。 mlt.qf
-
選用
預設值:無
使用與 DisMax 查詢剖析器相同的格式,查詢欄位及其提升。這些欄位也必須在
mlt.fl
中指定。 mlt.interestingTerms
-
選用
預設值:
none
在回應中新增一個區段,顯示用於 MoreLikeThis 查詢的最熱門詞彙(基於 TF/IDF)。它支援三個可能的值
-
list
列出詞彙。 -
none
不列出詞彙(預設值)。 -
details
列出詞彙以及每個詞彙使用的提升值。除非mlt.boost=true
,否則所有詞彙都會有boost=1.0
。
-
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
指定查詢是否將依據感興趣的詞彙相關性提升。它可以是
true
或false
。
查詢剖析器查詢與回應
MoreLikeThis 查詢剖析器請求的結構類似於使用 本機參數>的查詢,例如
{!mlt qf=name}1
這會使用 MoreLikeThis 查詢剖析器,根據「name」欄位,尋找類似於文件「1」的文件。
額外的參數會被加入括號內,例如,如果我們想要為 mintf
和 mindf
指定限制。
{!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}]
}}