有没有可能让SOLR更像使用不同字段进行模型和匹配?

有没有可能让SOLR更像使用不同字段进行模型和匹配?,solr,lucene,morelikethis,Solr,Lucene,Morelikethis,假设我有两个字段的文档,A和B 我想使用SOLR的更类似于此,但有一个转折点:我最感兴趣的是增强a字段类似于模型文档B字段的文档。(也就是说,从model B字段中提取MLT的“有趣术语”,但仅收集基于A字段的MLT结果。) 我看不到在单个查询中使用mlt.fl字段或mlt.qf提升来实现这种效果的方法。(mlt.fl似乎指定了用于发现“有趣术语”和匹配这些术语的字段。)我是否缺少一些选项 还是我必须自己提取“有趣的术语”并交换“字段:术语”的详细信息 (同样道理的其他想法也值得赞赏。)我看到的

假设我有两个字段的文档,A和B

我想使用SOLR的更类似于此,但有一个转折点:我最感兴趣的是增强a字段类似于模型文档B字段的文档。(也就是说,从model B字段中提取MLT的“有趣术语”,但仅收集基于A字段的MLT结果。)

我看不到在单个查询中使用mlt.fl字段或mlt.qf提升来实现这种效果的方法。(mlt.fl似乎指定了用于发现“有趣术语”和匹配这些术语的字段。)我是否缺少一些选项

还是我必须自己提取“有趣的术语”并交换“字段:术语”的详细信息

(同样道理的其他想法也值得赞赏。)

我看到的两个选择是:

  • 使用copyField-使用名为B的字段a的副本为原始文档编制索引,然后使用B进行查询
  • 扩展MoreLikeThisHandler并更改查询的字段
  • 第一个选项需要一些编程(主要是配置更改)和一些内存消耗。第二种方法需要更多的编程,但不会增加内存占用。希望其中一个适合您的需要。

    我看到的两个选项是:

  • 使用copyField-使用名为B的字段a的副本为原始文档编制索引,然后使用B进行查询
  • 扩展MoreLikeThisHandler并更改查询的字段

  • 第一个选项需要一些编程(主要是配置更改)和一些内存消耗。第二种方法需要更多的编程,但不会增加内存占用。希望其中一个适合您的需要。

    我现在认为有两种方法可以达到预期的效果(无需定制MLT源代码)

    第一个选项:使用进行初始MLT查询,添加参数
    &MLT.interestingTerms=details
    。这包括被认为有趣的术语列表,并根据它们的相对优势进行排名。通常的行为是在相同的mlt.fl字段中使用发现的术语来查找类似的文档。例如,响应将包括以下内容:

    "interestingTerms": 
        ["field_b:foo",5.0,"field_b:bar",2.9085307,"field_b:baz",1.67070794]
    
    (由于这个初始查询唯一有趣的是有趣的术语,因此加入一个排除所有文档的
    fq
    ,可以帮助它跳过不必要的评分工作。)

    显式地将感兴趣的术语信息重新组合到一个新的或查询
    字段\u a:foo^5.0字段\u a:bar^2.9085307字段\u a:baz^1.67070794
    相当于使用B字段示例文本来查找字段a中类似的文档,并且可能完全模仿默认MLT在其常用模型字段上的查询类型


    第二个选项:获取模型文档的实际字段B文本,并将其直接作为a输入,以代替用于指定模型文档的查询。然后将mlt.fl对准字段A,以便收集类似的结果。例如,参数片段可能是
    …&stream.body=foo-bar-baz&mlt.fl=field\u a&…
    。同样,最终的结果是,最初来自字段_b的模型文本只在字段_a中找到了相似的文档

    我现在认为有两种方法可以达到预期的效果(无需定制MLT源代码)

    第一个选项:使用进行初始MLT查询,添加参数
    &MLT.interestingTerms=details
    。这包括被认为有趣的术语列表,并根据它们的相对优势进行排名。通常的行为是在相同的mlt.fl字段中使用发现的术语来查找类似的文档。例如,响应将包括以下内容:

    "interestingTerms": 
        ["field_b:foo",5.0,"field_b:bar",2.9085307,"field_b:baz",1.67070794]
    
    (由于这个初始查询唯一有趣的是有趣的术语,因此加入一个排除所有文档的
    fq
    ,可以帮助它跳过不必要的评分工作。)

    显式地将感兴趣的术语信息重新组合到一个新的或查询
    字段\u a:foo^5.0字段\u a:bar^2.9085307字段\u a:baz^1.67070794
    相当于使用B字段示例文本来查找字段a中类似的文档,并且可能完全模仿默认MLT在其常用模型字段上的查询类型

    第二个选项:获取模型文档的实际字段B文本,并将其直接作为a输入,以代替用于指定模型文档的查询。然后将mlt.fl对准字段A,以便收集类似的结果。例如,参数片段可能是
    …&stream.body=foo-bar-baz&mlt.fl=field\u a&…
    。同样,最终的结果是,最初来自字段_b的模型文本只在字段_a中找到了相似的文档

    不确定(1)制作字段的额外副本有何帮助:字段已经存在。我只需要从其中一个提取有趣的术语,然后与另一个进行比较。是(2)将是最终的退路。。。虽然我认为不需要修改代码就可以达到预期的效果,只需要一系列正确的查询。有关详细信息,请参阅以下自我回答。不确定(1)制作字段的额外副本有何帮助:字段已经存在。我只需要从其中一个提取有趣的术语,然后与另一个进行比较。是(2)将是最终的退路。。。虽然我认为不需要修改代码就可以达到预期的效果,只需要一系列正确的查询。有关详细信息,请参阅以下自我回答。