Solr 的 MoreLikeThis 提高查询字段

7

我正在尝试使用Solr的MoreLikeThis功能。

我的架构涉及文章,并且我正在寻找三个字段内的文章之间的相似之处: article_title、article_text和topic。

以下查询效果很好:

q=id:(2e2ec74c-7c26-49c9-b359-31a11ea50453)
&rows=100000000&mlt=true
&mlt.fl=articletext,articletitle,topic&mlt.boost=true&mlt.mindf=1&mlt.mintf=1

但是我想尝试提高不同查询字段的权重,例如在文章标题上增加相似性的权重。

文档(http://wiki.apache.org/solr/MoreLikeThis)建议可以通过包含mlt.qf属性并进行一些提升来实现这一点。

我这方面的尝试查询如下:

q=id:(2e2ec74c-7c26-49c9-b359-31a11ea50453)&rows=100000000&mlt=true
&mlt.fl=articletext,articletitle,topic&mlt.boost=true
&mlt.mindf=1&mlt.mintf=1
&mlt.qf=articletext^0.1 articletitle^100 topic^0.1

然而,这些提升似乎没有任何影响 - 无论我提供什么提升,推荐结果都保持不变(我原本以为上述查询会严重偏向于标题的相似性,但事实并非如此)。我在文档中找不到使用MoreLikeThis这种方式的示例,这让我认为我做错了什么。有人成功地实现了类似的功能吗?

我也刚开始遇到这个问题。你可以在其中加入mlt.interestingTerms=details参数,以查看它根据原始文档选择的术语,而且它们似乎不会随着我放入mlt.fl参数(或者我剩下哪些字段)而改变。 - Simon
2个回答

3
MLT组件在您只需要匹配一个字段,或多个同等重要性的字段时非常有用。但是每当您想要变化不同字段之间相对重要性的时间,或需要执行更特定的操作(例如包括反向距离提升)时,您可能需要编写自己的伪MLT处理程序。所有MLT处理程序所做的就是基于源文档中的tf.idf得分从指定字段生成顶部术语。您可以很容易地在某些生成自定义SOLR OR查询的代码中模拟该功能。您将失去术语向量的优势,但只要您的查询大小合理(例如<20个术语),它可能会执行得相当好。我们有一个小型索引,因此使用几百个术语生成我们自己的MLT查询,并且它在可接受的时间内执行(几毫秒)。但是,我曾看到这种行为在具有几亿个文档和更大字段的大型索引上出现了一些恶化的情况,在这些情况下,您需要将查询限制为少量顶部术语。使用您自己的代码代替MLT需要更多的工作,但是您可以获得更多的灵活性。

1

在我的案例中,我也遇到了相同的问题,我需要使用more like this在两个字段1)描述和2)columnValue上找到文档的相似性,其中columnValue比描述在最终得分中具有更高的权重。由于solr仅支持字符串类型的相似匹配,不支持double类型,因此我已将columnValue字段转换为字符串类型。(即,双精度值现在是字符串类型,例如:231.0 现在是 "231.0")。 这里是schema:

enter image description here schema.xml

我正在使用以下查询:

http://hostname:8983/solr/collection3/mlt?q= &wt=xml&indent=true&mlt=true&mlt.fl=description,columnValue &fq=versionId:1068383519&mlt.count=4000&mlt.mindf=1&mlt.mintf=1 &fl=tableId,tableIndex,score,versionId,columnId,description,columnValue, refVersionId &mlt.qf=description^0.4+columnValue^0.6

这里的"id"是refVersionId、VersionId、TableId、TableIndex和ColumnId的组合键。

问题在于,对columnValue进行加权没有效果,即使我从mlt.fl和mlt.qf中删除columnValue,响应中也没有任何变化,columnValue没有参与相似度匹配。据我观察,mlt仅在单个字段即description上起作用。您有任何建议或解决此问题的方法吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接