是的,通过 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