7

我正在试验 Solr 的 MoreLikeThis 功能。

我的模式处理文章,我正在寻找三个字段中文章之间的相似之处:文章标题、文章文本和主题。

以下查询运行良好:

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 的示例,这让我相信我有问题。

有没有人设法实现这样的目标?

4

2 回答 2

3

如果您有简单的推荐要求,而您只有一个字段要匹配,或者几个同等重要的字段,则 MLT 组件很有用。但是任何时候你想改变不同字段的相对重要性,或者需要做一些更具体的事情,比如包括反距离提升,那么你可能想要编写自己的伪 MLT 处理程序。MLT 处理程序所做的只是根据源文档中的 tf.idf 分数从指定的字段中生成最热门的术语。您可以在生成自定义 SOLR OR 查询的某些代码中轻松模拟该功能。您将失去术语向量的优势,但只要您的查询大小合理(例如 < 20 个术语),它可能会执行得很好。我们有一个小索引,因此生成我们自己的包含数百个术语的 MLT 查询,并且它在可接受的时间(几毫秒)内执行。但是,我发现这种行为在包含几亿个文档和更大字段的大型索引上有所恶化,在这些情况下,您需要将查询限制为少数几个顶级术语。使用您自己的代码代替 MLT 需要更多的工作,但您会获得更多的灵活性。

于 2014-08-31T18:28:01.903 回答
1

即使我在我的情况下面临同样的问题,我也必须在两个字段 1)描述和 2)columnValue 中找到文档之间的相似性,其中 columnValue 在最终得分中的权重高于描述。由于 solr 仅支持字符串类型相似性匹配并且它不支持双精度类型,所以我将 columnValue 字段转换为字符串类型。(即双精度值现在是字符串类型,例如:231.0 现在是“231.0”)。这是架构:

在此处输入图像描述 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 只在单个字段上工作,即描述。你有任何建议或任何解决方案来解决这个问题。

于 2016-08-25T07:35:22.073 回答