【问题标题】:Lucene search across different object models跨不同对象模型的 Lucene 搜索
【发布时间】:2011-12-06 03:10:11
【问题描述】:

我正在考虑使用 Lucene 为网站提供搜索功能。

该网站包含几个不同的对象模型(例如论坛、投票等),我希望能够允许跨不同的对象模型进行搜索(例如搜索论坛和|或投票)

我有两个(有些相关的)问题:

  1. 对象是否需要提供一致的(即与 Lucene 相同的接口)? - 例如,所有要成为索引的对象都应该有id、title、content等属性,还是每个对象都可以存储不同的数据字段?

  2. 用户搜索特定关键字需要什么语法(仅投票或投票和论坛 [作为示例])?

我正在使用 Lucene 的 PHP 端口。

【问题讨论】:

    标签: php lucene


    【解决方案1】:

    你有两个选择。

    1. 为每种类型的文档(论坛、投票等)创建一个单独的索引。优势,更简单的查询,更简单的文档,更准确的匹配(您的字段规范化不受其他文档数据的影响)。缺点是必须维护单独的索引,具有不同的文档。

    2. 创建单个索引。您存储的 Document 将是您要查询的所有对象的所有字段的联合。您添加一个附加字段,该字段是您要存储的类型(论坛、投票等)。然后,在查询时,您按类型过滤以仅获得您想要的结果。优势,维护单个文档/索引。缺点是,您可能会在共享字段上产生一些串扰,从而扭曲搜索结果。

    为了澄清我在上面 2 中提到的缺点。 Lucene 对“稀有”术语具有固有的权重。如果您有一个使用稀有术语的查询,并且该术语仅出现在几个文档中,则这些文档将冒泡到搜索结果的顶部。如果您在联合中的 2 个不同文档之间共享一个字段,可能(并非总是)出现搜索结果的权重与应有的不同的情况,这对最终用户来说是显而易见的。

    为了正确性,我倾向于选项 1,为了便于维护,我倾向于选项 2。这是一种权衡。

    编辑:如果您想在单个查询中支持跨多种类型的查询,则选项 2 更可取。这是您能够混合来自不同文档类型的结果的唯一方法。由于评分算法,查询 2 个索引并尝试以某种方式对结果进行排序几乎是不可能的。

    【讨论】:

      【解决方案2】:

      Lucene 使用“文档”的概念,它们是 Lucene 索引中的条目。每个文档都有几个“字段”,其中包含实际数据。您将能够搜索添加到 Lucene 索引中的任何内容,但重要的是要使用允许将查询结果匹配回模型实例的标识符来创建这些条目。

      这意味着,如果您将数据保存在关系数据库中,并且使用数字 ID,那么您使用 Lucene 创建的索引条目将必须同时包含相应的标识符和“类型”(例如, table),这样你就可以知道 id 对应什么样的实例。

      在语法方面,Lucene 提供了非常好的类似 google 的查询语法。创建 Lucene 文档/索引条目的方式将决定查询的表达方式。

      【讨论】:

      • 这是一个相当高级的概述——这是我目前所拥有的。我正在寻找的是关于如何实际实现所需功能的更多细节(最好使用一些伪代码/代码 sn-p),而无需从头到尾阅读整个 Lucene 手册。
      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2010-12-17
      • 2016-08-21
      相关资源
      最近更新 更多