Lucene和SQL Server - 最佳实践

sol*_*ljy 11 sql-server lucene

我是Lucene的新手,所以想得到你们的帮助:)

背景:目前我有存储在SQL Server中的文档,并希望使用Lucene对SQL Server中的那些文档进行全文/标记搜索.

Q1)在这种情况下,为了对文档进行关键字搜索,我应该将所有这些文档都插入到Lucene索引中吗?这是否意味着会有数据重复(一个在SQL Server中,另一个在Lucene索引中?)这可能是因为我们有大量文档(大约100GB).这是不可避免的吗?

Q2)此外,每个文档都有一组标签(最多3个).Lucene也是标签搜索的不错选择?如果是这样,怎么办?

谢谢,

fem*_*gon 7

是的,通过Lucene提供全文搜索,通过传统数据库进行数据存储是一个受到良好支持的架构. 看看这里,简要介绍一下.典型的实现方式是索引您希望能够支持搜索的任何内容,并在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));
Run Code Online (Sandbox Code Playgroud)

我可以简单地向任何查询添加一个必需的术语,以便仅在特定标签内搜索.例如,如果我要搜索"some stuff",但只使用标签"forkids",我可以编写一个类似的查询:

some stuff +tags:forkids
Run Code Online (Sandbox Code Playgroud)