MoreLikeThis
MoreLikeThis 允许对结果列表中与某个文档相似的文档进行查询。
它通过使用原始文档中的术语在索引中查找类似文档来实现此目的。
有几种方法可以使用 MoreLikeThis。第一种也是最常见的方法是将其用作请求处理程序。在这种情况下,您需要根据需要将文本发送到 MoreLikeThis 请求处理程序(例如,当用户单击“类似文档”链接时)。
第二种方法是将其用作搜索组件。这不太可取,因为它对与用户查询匹配的每个文档执行 MoreLikeThis 分析。这可能会降低搜索结果的速度。
另一种方法是将其用作请求处理程序,但使用外部提供的文本。此案例也称为 MoreLikeThisHandler,它将根据输入文档的文本提供有关索引中类似文档的信息。
最后,可以使用 MLT 查询解析器。它的操作方式与请求处理程序非常相似,但由于它是一个查询解析器,因此可以在过滤器查询、提升查询等中使用它,并且可以根据需要对结果进行分页或高亮显示。
MoreLikeThis 的工作原理
MoreLikeThis
根据文档中的术语构建一个 Lucene 查询。它通过从请求中提供的字段列表中提取术语来实现此目的。
为了获得最佳结果,字段应具有存储的词向量(termVectors=true
),可以在 架构中配置 这些词向量。如果未存储词向量,MoreLikeThis 可以从存储的字段中生成术语。uniqueKey
使用的字段也必须存储,以便 MoreLikeThis 正常工作。
原始文档中的术语使用 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
-
可选
默认值:
无
在响应中添加一个部分,显示用于 MoreLikeThis 查询的顶级术语(基于 TF/IDF)。它支持三个可能的值
-
list
列出术语。 -
none
不列出术语(默认值)。 -
details
列出术语以及用于每个术语的提升值。除非mlt.boost=true
,否则所有术语都将具有boost=1.0
。
-
MoreLikeThis 请求处理程序
请求处理程序配置
MoreLikeThis 请求处理程序默认情况下未配置,在使用之前需要进行设置。您可以通过手动编辑 solrconfig.xml
或使用 Config API 来执行此操作
手动配置
<requestHandler name="/mlt" class="solr.MoreLikeThisHandler">
<str name="mlt.fl">body</str>
</requestHandler>
Config API
curl -X POST -H 'Content-type:application/json' -d {
"add-requesthandler": {
"name": "/mlt",
"class": "solr.MoreLikeThisHandler",
"defaults": {"mlt.fl": "body"}
}
} http://localhost:8983/solr/<collection>/config
以上两个示例都将 mlt.fl
参数设置为请求处理程序的“body”。这意味着对处理程序的所有请求都将使用该参数值,除非在单个请求中明确覆盖。
有关一般请求处理程序配置的更多信息,请参阅 默认组件 部分。
请求处理程序参数
除了上述 通用参数 外,MoreLikeThis 请求处理程序还支持以下参数。它支持使用通用查询参数进行分面、分页和过滤,但与备用查询解析器配合得不好。
mlt.match.include
-
可选
默认值:
true
指定响应是否应包括匹配的文档。如果设置为
false
,则响应将看起来像一个正常的 select 响应。 mlt.match.offset
-
可选
默认值:无
指定主查询搜索结果中的偏移量,以找到应在其中执行 MoreLikeThis 查询的文档。默认情况下,查询针对
q
参数的第一个结果进行操作。
请求处理程序查询和响应
对 MoreLikeThis 请求处理程序的查询使用在配置时定义的名称(在上述示例中为 /mlt
)。
以下示例查询使用在 Solr 示例文档集(./example/exampledocs
)中找到的文档(q=id:0553573403
),并要求使用作者字段查找类似文档(mlt.fl=author
)。
http://localhost: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 或文件。
http://localhost: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
)。
http://localhost: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 提供的示例文档的查询,如下所示
http://localhost: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}]
}}