0

标题有点尴尬,但我找不到更好的。我的问题如下:

我有几个用户存储为文档,并且我为每个文档存储了几个键值对或项目(具有 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 ...

现在,如果我对文本字段使用突出显示并针对“餐厅”进行查询,我会得到 user2 和 text nice <b>restaurant</b>。但是如何确定要显示的突出显示文本的 id,例如该项目的标题?如果在项目列表的末尾列出更多相关项目会发生什么?突出显示不会显示那些...

那么如何找到具有多个此类项目的文档的最佳项目?

我添加了我的两个发现作为答案,但正如我将指出的那样,它们中的每一个都有其自身的缺点。

谁能指出我更好的解决方案?

4

3 回答 3

1

您可以使用两个索引:问题中描述的 users->items 和引用用户的“纯项目”索引。

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

  1. 查询用户索引 => 例如 10 个用户的列表
  2. 为每个用户查询项目索引 1. step => best items

假设以下示例:

用户 A 的电子邮件是“餐厅 X 很差,但餐厅 X 很便宜”、“不同主题”、“不同主题 B”和

用户 B 的电子邮件是“餐厅 X 不好”、“重访了餐厅 X,现在还可以”、“再次来到餐厅 X,我认为这是最好的”。

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

缺点:

  • 性能不佳,因为您需要针对用户索引进行一次查询,例如再查询 10 次才能为每个用户获取最相关的项目。
  • 维护两个索引。

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

于 2010-06-07T12:04:27.567 回答
1

我设计 Solr 模式的经验法则之一是:文档就是您要搜索的内容。

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

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

您可以启用突出显示以获取与“restaurant X”查询匹配的“文本”或“标题”字段的片段。

如果您想向最终用户提供有关撰写“restaurant X”的用户的信息,您可以在“用户”字段中设置分面。然后最终用户会看到 John 写了 10 封关于“restaurant X”的电子邮件,而 Robert 写了 6 封。最终用户认为“这个 John 伙计必须对这家餐厅了解很多”,因此他深入搜索“restaurant x” ' 带有过滤查询user:John

于 2010-06-07T21:29:25.663 回答
0

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

这种方法的问题是您不会获得最相关的用户。IE。最相关的项目不一定来自最相关的用户(因为他可以有几个稍微不太相关的项目)

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

于 2010-06-07T11:59:27.530 回答