Lucene和SQL服务器 - 最佳实践

问题描述:

我非常新Lucene的,所以想从你们:)得到一些帮助Lucene和SQL服务器 - 最佳实践

背景:目前,我有存储在SQL Server文件和要使用的Lucene全文本/标签在SQL Server中的这些文档上进行搜索。 Q1)在这种情况下,为了对文档进行关键字搜索,我应该将所有这些文档插入到Lucene索引中吗?这是否意味着会有数据重复(一个在SQL Server中,另一个在Lucene索引中?)这可能是一个问题,因为我们有大量的文档(大约100GB)。这是不可避免的吗? Q2)另外,每个文档都有一组标签(最多3个)。 Lucene也是标签搜索的不错选择?如果是这样,该怎么办?

感谢,

是,通过Lucene和数据存储是通过传统的数据库,提供全文检索是一个很好的支持架构。 Take a look here,简要介绍。一个典型的实现方式是索引任何你希望能够支持搜索的内容,并且只在Lucene索引中存储唯一的标识符,并根据ID从数据库中提取搜索到的所有记录。如果您想减少数据库负载,可以在Lucene中存储一些信息以显示搜索结果列表,并且只查询数据库以获取完整文档。

至于节省空间,会有一些重复的措施。尽管你只有Lucene,但这是真的。 Lucene存储用于完全独立于存储数据进行搜索的倒排索引。为了节省空间,我建议你非常慎重地考虑你选择索引哪些数据,以及你需要存储什么并且能够稍后检索。您存储的内容对于在Lucene中节省空间尤为重要,因为在大多数情况下,仅索引值通常非常节省空间。

Lucene肯定可以实现标签搜索。实现它的简单方法是将每个标签添加到您所选择的领域(我称之为是“标签”,这似乎是有道理的),同时建立了文档,如:

document.add(new Field("tags", "widget", Field.Store.NO, Field.Index.ANALYZED)); 
document.add(new Field("tags", "forkids", Field.Store.NO, Field.Index.ANALYZED)); 

我可以简单地将所需的术语添加到任何查询中以仅在特定标签内进行搜索。例如,如果我要搜索“某些内容”,但只能使用“forkids”标记,则可以编写如下查询:

some stuff +tags:forkids 

文件也可以存储在Lucene中,你可以检索和使用文档ID引用它们。

我建议在Lucene之上使用Solr http://lucene.apache.org/solr/,它更具用户友好性,默认情况下具有multiValued字段(对于标签)。

http://wiki.apache.org/solr/SchemaXml

+0

感谢您的回答。那么你认为只有在Lucene中维护文档才是一个通用的体系结构?是否有任何维护数据库和lucene数据的情况? – soleiljy 2013-02-27 19:29:42

+0

如果您只对实际内容和一些元数据感兴趣,我认为不需要额外的数据库。 – Elmer 2013-02-27 22:56:45