Php 跨不同对象模型的Lucene搜索

Php 跨不同对象模型的Lucene搜索,php,lucene,Php,Lucene,我正在考虑使用Lucene为网站提供搜索功能 该网站包含几个不同的对象模型(如论坛、投票等),我希望能够允许在不同的对象模型(如搜索论坛和|或投票)之间进行搜索 我有两个(有些相关)问题: 对象是否需要提供一致的(即与Lucene相同的接口)?-例如,所有要作为索引的对象是否都应该具有id、标题、内容等属性,或者每个对象是否可以存储不同的数据字段 用户搜索(仅轮询或轮询和论坛[作为示例])特定关键字需要什么语法 我正在使用Lucene的PHP端口。Lucene使用“文档”的概念,文档是Lucen

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

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

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

  • 对象是否需要提供一致的(即与Lucene相同的接口)?-例如,所有要作为索引的对象是否都应该具有id、标题、内容等属性,或者每个对象是否可以存储不同的数据字段

  • 用户搜索(仅轮询或轮询和论坛[作为示例])特定关键字需要什么语法


  • 我正在使用Lucene的PHP端口。

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

    这意味着,如果您的数据位于关系数据库中,并且使用数字id,那么您使用Lucene创建的索引项必须包含相应的标识符和“类型”(例如,表),这将允许您知道id对应的实例类型

    至于语法,Lucene提供了非常好的类似google的查询语法。如何创建Lucene文档/索引项将决定查询的表达方式

    您有两种选择

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

  • 创建一个索引。存储的文档将是要查询的所有对象的所有字段的并集。您添加了一个附加字段,该字段是您存储的类型(论坛、投票等)。然后,在查询时,您可以按类型进行筛选,以仅获得所需的结果。优点是,需要维护单个文档/索引。缺点是,您可以在共享字段上获得一些串扰,这会扭曲搜索结果

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

    我倾向于选择1以确保正确性,选择2以便于维护。这是一种交换


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

    这是一个相当高的概述-这就是我目前拥有的。我要寻找的是关于如何真正实现所需功能的更多细节(最好是使用一些伪代码/代码片段),而不必通读整个Lucene手册。