&引用;二维搜索“;在Solr中,或者如何获得多值字段的最佳项';项目';?

&引用;二维搜索“;在Solr中,或者如何获得多值字段的最佳项';项目';?,solr,highlighting,key-value,Solr,Highlighting,Key Value,标题有点别扭,但我找不到更好的了。我的问题如下: 我将多个用户存储为文档,并为每个文档存储多个键值对或项(具有id)。现在,如果我使用hl.snippets=5应用高亮显示,我可以得到前5项。但是每个用户都可能有几百个项目,所以 您将无法获得最相关的5项。您将获得第一个5项 另一个问题是 突出显示的文本将不包含id,因此检索突出显示的项目文本的附加信息非常困难 项目为电子邮件的示例: user1 has item1 { text:"developers developers develo

标题有点别扭,但我找不到更好的了。我的问题如下:

我将多个用户存储为文档,并为每个文档存储多个键值对或项(具有id)。现在,如果我使用hl.snippets=5应用高亮显示,我可以得到前5项。但是每个用户都可能有几百个项目,所以

  • 您将无法获得最相关的5项。您将获得第一个5项
另一个问题是

  • 突出显示的文本将不包含id,因此检索突出显示的项目文本的附加信息非常困难
项目为电子邮件的示例:

user1 has item1 { text:"developers developers developers", id:1, title:"ms" }
          item2 { text:"c# development",                   id:2, title:"nice!" }
          ...
          item77 ...

user2 has item1 { text:"nice restaurant", id:3, title:"bla"}
          item2 { text:"best cafe",       id:4, title:"blup"}
          ...
          item223 ...
现在,如果我在文本字段中使用高亮显示并查询“restaurant”,我会得到user2和文本
nice restaurant
。但是如何确定要显示的突出显示文本的id,例如,此项目的标题?如果在项目列表的末尾列出了更多相关项目,会发生什么情况?高亮显示不会显示这些

那么,如何才能找到包含多个此类项目的文档的最佳项目呢

我添加了我的两个发现作为答案,但正如我将指出的,它们都有各自的缺点。

有人能给我指出更好的解决方案吗?

您可以使用并将每个项目存储为单独的文档链接回用户

这种方法的问题在于,您无法获得最相关的用户。即,最相关的项目不一定来自最相关的用户(因为他可以有几个稍微不相关的项目)


请参阅我第二个答案中的“假设以下示例:”部分。

您可以使用两个索引:用户->问题中描述的项目,以及一个“纯项目”引用回用户的索引

然后您将需要2个查询(这就是我将问题称为“Solr中的2d搜索”的原因):

  • 查询用户索引=>例如10个用户的列表
  • 为1的每个用户查询项目索引。步骤=>最佳项目
  • 假设以下示例:

    userA的电子邮件是“X餐厅不好,但X餐厅便宜”,“不同主题”,“不同主题”和

    userB的电子邮件是“X餐厅不好”,“再次访问X餐厅,现在一切正常”,“再次访问X餐厅,我认为这是最好的”

    现在我查询“restaurant X”的用户索引,第一个用户将是userB,这就是我想要的。如果我只查询item索引,我将得到不太相关的userA的item1

    缺点:

    • 性能差,因为您需要对用户索引进行一次查询,例如,再进行10次查询才能获得每个用户最相关的项
    • 维持两个指数

    更新为了避免许多查询,我将尝试以下方法:使用用户索引获取一些突出显示的代码段,然后为每个用户提供“获取相关项目”按钮,然后触发对项目索引的查询。

    我设计Solr模式的经验法则之一是:您将搜索文档因为

    如果您想搜索“项目”,那么这些“项目”就是您的文档。如何存储其他东西,比如“用户”,是次要的。因此,“用户”可能位于您提到的另一个索引中,他们可能在关系数据库中被“非规范化”(例如,他们的信息在每个文档中重复),等等。这取决于RDBMS的可用性、有多少“用户”、这些“用户”有多少字段等等

    编辑:现在你解释“项目”是电子邮件,可能的搜索是“餐厅X”,你想找到最好的“项目”(电子邮件)。因此,文档就是电子邮件。模式可以如此简单:(id、title、text、user)

    您可以启用高亮显示以获取与“餐厅X”查询匹配的“文本”或“标题”字段的片段


    如果您想提供有关编写“餐厅X”的用户的最终用户信息,可以将“用户”字段分面。最终用户会看到John写了10封关于“X餐厅”的电子邮件,Robert写了6封。最终用户认为“这位约翰·杜德一定很了解这家餐厅”,因此他通过过滤查询深入到“餐厅x”的搜索
    user:John

    为什么必须先搜索“用户”?我也不明白为什么有11个问题。我不完全理解这个问题。你能详细说明你的用例吗?不太清楚你为什么要用高亮显示。毛里西奥,我可以用高亮显示,是的。我将尝试更改描述,以便更清楚地说明为什么它不是最佳解决方案。也许我没有完全理解高亮显示是如何工作的。Ups,误读了你们的问题。我使用高亮显示来显示包含查询的项目。我无法为每个用户显示所有项目(太多),但我想让我的客户(进行搜索的客户)对用户的项目有一个良好的印象,以及这些项目是否与他们正在寻找的内容相关。这篇文章(您的评论)是我对第二个问题的意思:第二个问题的另一个链接:=>1。自定义字段类或类似于我建议的2。存储键(分隔符)值3。动态字段“items_*”感谢Mauricio的建议!问题是我希望用户成为“文档”。但我还需要显示每个用户的最佳项目,因为可能有很多项目。。。因此,我的客户可以很容易地决定何时搜索,如果建议的用户与他们的查询意图匹配,那么问题是如果查询只返回少数用户的项,甚至只返回一个用户的项,因此,在我的另一个答案中描述的折叠补丁可以改善这种情况,这样每个用户最多可以获得1到2项。@Karussell:是的,我想我现在正在慢慢理解您的问题:-)。我想你必须决定什么对最终用户更重要:获取相关的“项目”(无论“用户”是什么),还是获取不那么相关的内容