我正在考虑使用Lucene为网站提供搜索功能。
该网站包含多个不同的对象模型(例如论坛,民意调查等),我希望能够允许搜索不同的对象模型(即搜索论坛和/或民意调查)
我有两个(有些相关的)问题:
对象是否需要提供一致的(即与Lucene相同的接口)? - 例如,所有要作为索引的对象是否应具有id,title,content等属性,或者每个对象是否可以存储不同的数据字段?
用户需要使用哪种语法进行搜索(仅轮询或轮询AND论坛[作为示例])特定关键字?
我正在使用Lucene的PHP端口。
答案 0 :(得分:3)
您有2个选项。
为每种类型的文档(论坛,民意调查等)创建单独的索引。优点,更简单的查询,更简单的文档,更准确的匹配(您的字段规范化不受其他文档数据的影响)。缺点是,必须保持单独的索引,具有不同的文档。
创建单个索引。您存储的文档将是您要查询的所有对象的所有字段的并集。您添加了一个附加字段,即您要存储的类型(论坛,民意调查等)。然后,在查询时,按类型过滤以仅获得所需的结果。优势,单一文件/索引维护。缺点是,您可能会在共享字段上产生一些可能会使搜索结果出现偏差的串扰。
澄清我在上面2中提到的缺点。 Lucene对“稀有”术语有着固有的重要性。如果您的查询使用了罕见的术语,并且该术语仅显示在几个文档中,那么这些文档将向搜索结果的顶部冒泡。如果您在联合中的两个不同文档之间共享一个字段,则可以(并非总是)是搜索结果的权重与它们应有的不同的情况,这对最终用户来说是显而易见的。
我倾向于选择1的正确性,2倾向于易于维护。这是一种权衡。
编辑:如果要支持在单个查询中跨多个类型进行查询,则最好使用选项2。这是您能够混合不同文档类型的结果的唯一方法。由于评分算法,查询2个索引并试图以某种方式对结果进行排序几乎是不可能的。
答案 1 :(得分:0)
Lucene使用“文档”的概念,它是Lucene索引中的条目。每个文档都有几个“字段”,其中包含实际数据。您将能够搜索添加到Lucene索引中的任何内容,但是使用允许将查询结果与模型实例匹配的标识符创建这些条目非常重要。
这意味着,如果您在关系数据库中拥有数据并使用数字ID,那么使用Lucene创建的索引条目必须包含相应的标识符和“类型”(例如,表),它将允许您知道id对应的实例类型。
至于语法,Lucene提供了一个非常好的类似谷歌的查询语法。如何创建Lucene文档/索引条目将决定查询的表达方式。