2011-12-05 70 views
2

我正在考虑使用Lucene为网站提供搜索功能。Lucene搜索不同的对象模型

网站包含几个不同的对象模型(例如论坛,民意调查等),我想能够让搜索翻过不同的对象模型(即搜索论坛和|或调查)

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

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

  2. 用户需要什么语法才能搜索某个特定关键字(仅作为示例或轮询AND论坛[作为示例])?

我正在使用Lucene的PHP端口。

回答

0

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

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

至于语法,Lucene提供了一个非常好的谷歌般的查询语法。您如何创建您的Lucene文档/索引条目将决定您的查询如何表达。

+0

这是一个非常高层次的概述 - 这是我目前拥有的。我正在寻找的是关于如何实际实现所需功能(最好带有一些伪代码/代码片段)的细节,而不必从封面到封面阅读整个Lucene手册。 –

3

您有2个选项。

  1. 为每种类型的文档(论坛,投票等)创建单独的索引。优点是,查询更简单,文档更简单,匹配更准确(您的字段规范化不受其他文档数据的影响)。缺点是不得不保持单独的指数,有不同的文件。

  2. 创建一个索引。您存储的文档将是要查询的所有对象的所有字段的并集。您添加一个额外的字段,即您正在存储的类型(论坛,投票等)。然后,当查询时,您按类型过滤以仅获得您想要的结果。优点,单个文件/索引来维护。缺点是,你可能会在共享字段上产生一些串扰,导致搜索结果偏斜。

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

我倾向于选项1的正确性,2为便于维护。这是一种折衷。

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