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 支持的示例文档字段中解析的最大 token 数量。

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,则响应将类似于正常的 select 响应。

mlt.match.offset

可选

默认值:无

指定在主查询搜索结果中的偏移量,以定位 MoreLikeThis 查询应操作的文档。默认情况下,查询对 q 参数的第一个结果进行操作。

请求处理程序查询和响应

对 MoreLikeThis 请求处理程序的查询使用配置时定义的名称(在上面的示例中为 /mlt)。

以下示例查询使用 Solr 示例文档集(./example/exampledocs)中找到的文档 (q=id:0553573403),并要求使用 author 字段来查找相似的文档 (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 部分显示了用于查找相似文档的 author 字段中的词项。因为我们没有指定 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 个在 author 字段中包含词项 “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 支持的示例文档字段中解析的最大 token 数量。

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 时,它会查询模式中的所有字段,这通常会在数字和其他特定格式的字段类型上失败。如果您需要使用不同的内容查询不同的字段,请将多个 {!mlt_content qf=fieldA}lorem ipsum{!bool} 查询或其他查询结合使用。