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

可选

默认值:无

使用相对于索引中文档数量的比率指定最大文档频率。提供的值必须介于 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

可选

默认值:

在响应中添加一个部分,显示用于 MoreLikeThis 查询的顶级术语(基于 TF/IDF)。它支持三个可能的值

  • list 列出术语。

  • none 不列出术语(默认值)。

  • details 列出术语以及用于每个术语的提升值。除非 mlt.boost=true,否则所有术语都将具有 boost=1.0

要将此参数与 搜索组件 一起使用,则无法分发查询。为了获得有趣的术语,必须将查询发送到单个分片,并且仅限于该分片(使用 shards 参数)。但是,MoreLikeThis 请求处理程序支持多分片支持。

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

指定查询是否将通过有趣的术语相关性进行提升。它可以是 truefalse

查询解析器查询和响应

MoreLikeThis 查询解析器请求的结构类似于使用 本地参数> 的查询,如下所示

{!mlt qf=name}1

这将使用 MoreLikeThis 查询解析器基于“name”字段查找与文档“1”相似的文档。

其他参数将添加到括号内,例如如果我们想要为 mintfmindf 指定限制

{!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}]
  }}

外部内容的查询解析器

使用 {!mlt_content}lorem ipsum{!mlt_content q='lorem ipsum'} 来查找与 SolrCloud 模式下索引中不存在的外部内容相似的文档,如 /mlt 处理程序和内容流。参数和响应与上面相同。它使用给定内容查询通过 qf 参数传递的字段。当省略 qf 时,它会查询架构中的所有字段,这些字段通常在数字和其他特定格式的字段类型上失败。如果您需要使用不同的内容查询不同的字段,请将几个 {!mlt_content qf=fieldA}lorem ipsum{!bool} 查询或其他查询结合起来。