我正在尝试使用Solr的MoreLikeThis功能。
我的架构涉及文章,我正在寻找三个领域内文章之间的相似之处: articletitle,articletext和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的任何示例,这让我相信我有错误。
有没有人设法达到这样的目标?
答案 0 :(得分:3)
如果您有简单的推荐要求,只有一个字段可以匹配,或者几个具有相同的重要性,那么MLT组件非常有用。但是,只要你想改变不同字段的相对重要性,或者需要做一些更具体的事情,比如包括反距离提升,那么你可能想要编写自己的伪MLT处理程序。所有MLT处理程序都是根据源文档中的tf.idf分数从指定的字段生成顶级术语。您可以在生成自定义SOLR OR查询的某些代码中轻松模拟该功能。你将失去termvectors的优势,但只要你的查询大小合适(比如说< 20 terms),它就可能表现得相当不错。我们有一个小索引,所以用几百个术语生成我们自己的MLT查询,并在可接受的时间内(几毫秒)执行。但是,我已经看到这种行为在具有1亿个文档和更大字段的大型索引上有所恶化,在这种情况下,您需要将查询限制为少量顶级术语。使用您自己的代码代替MLT是更多的工作,但您在灵活性方面获得了更多。
答案 1 :(得分:1)
即使iam在我的情况下遇到同样的问题我必须在两个字段中找到更多类似的文档之间的相似性1)描述和2)columnValue其中columnValue其中columnValue被赋予比最终得分中的描述更多的权重。由于solr仅支持字符串类型相似性匹配并且它不支持double类型,所以我将columnValue字段转换为字符串类型。(即double值现在是字符串ex:231.0现在是" 231.0&#34 )。 这是架构:
enter image description here schema.xml中
和我正在使用的查询
http://hostname:8983/solr/collection3/mlt?q= &安培;重量= XML&安培;缩进=真安培; MLT =真安培; mlt.fl =描述,columnValue &安培; FQ = VERSIONID:1068383519&安培; mlt.count = 4000&安培; mlt.mindf = 1&安培; mlt.mintf = 1 &安培; FL = TABLEID,tableIndex,得分,VERSIONID,ColumnID的介绍,columnValue, refVersionId& mlt.qf = description ^ 0.4 + columnValue ^ 0.6
这里" id"是refVersionId,VersionId,TableId,TableIndex,ColumnId的复合键
但问题是columnValue提升无效,即使我从mlt.fl和mlt.qf中删除了columnValue,我也没有发现响应有任何变化,columnValue没有参与相似性匹配。据我所知,mlt仅适用于单一领域,即描述。您是否有任何建议或任何解决方案来解决此问题。