11

我对 Lucene 很陌生,所以想从你们那里得到一些帮助:)

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

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

Q2)此外,每个文档都有一组标签(最多 3 个)。Lucene 也是标签搜索的好选择吗?如果是这样,该怎么做?

谢谢,

4

2 回答 2

9

是的,通过 Lucene 提供全文搜索并通过传统数据库提供数据存储是一种得到良好支持的架构。 看看这里,简单介绍一下。一个典型的实现是对您希望能够支持搜索的任何内容进行索引,并在 Lucene 索引中仅存储一个唯一标识符,并根据 ID 从数据库中提取通过搜索找到的任何记录。如果你想减少 DB 负载,你可以在 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
于 2013-02-27T20:21:53.000 回答
1

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

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

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

于 2013-02-27T19:17:08.333 回答