结合Lucene.NET和关系数据库的最佳实践?

时间:2009-06-13 14:48:01

标签: lucene.net

我正在开发一个项目,我将拥有大量数据,并且可以通过几种非常有效表达为SQL查询的表单进行搜索,但也需要通过自然语言处理进行搜索。

我的计划是使用Lucene为这种搜索形式建立一个索引。

我的问题是,如果我这样做并执行搜索,Lucene将返回索引中匹配文档的ID,然后我必须从关系数据库中查找这些实体。

这可以通过两种方式完成(到目前为止我能想到的):

  • N次查询(恐怖)
  • 立即将所有ID传递给存储过程(可能是逗号分隔的参数)。这有一个缺点,即限制为最大参数大小,以及UDF将字符串拆分为临时表的速度慢。

我几乎想把所有内容镜像到lucenes索引,这样我就可以定期从后备存储生成索引,但只需要为前端访问它。

么?

4 个答案:

答案 0 :(得分:4)

我会存储'前端'索引本身内部的数据,避免任何数据库交互。只有当您需要有关特定记录的更多信息时才会查询数据库。

答案 1 :(得分:2)

当我遇到这个问题时,我选择了一个具有全文搜索功能的关系数据库(我使用了PostgreSQL 8.3,它内置了ft支持,具有词干和词库支持)。这样,数据库可以使用SQL和ft命令进行查询。缺点是你需要一个具有全文搜索功能的数据库,这些功能可能不如lucene所能做的那样。

答案 2 :(得分:1)

我想答案取决于你要对结果做什么,如果要在网格中显示结果并让用户选择他想要访问的确切文档,那么你可能想要添加到索引足够的文本来帮助用户识别文档,就像一个说200个字符的模糊,然后一旦成员选择一个文件命中DB就可以检索整个文件。

这肯定会影响索引的大小,因此这是您需要记住的另一个考虑因素。我还会在数据库和前端之间放置一个缓存,以便最常用的项目不会每次都产生数据库访问的全部费用。

答案 3 :(得分:0)

可能不是一个选项,取决于您的数据库中有多少东西,但我所做的是将db id存储在搜索索引中以及我想要索引的属性。然后在我的服务类中,我缓存显示所有对象的搜索结果所需的所有数据(例如,名称,数据库ID,图像URL,描述模糊,社交媒体信息)。服务类返回一个可以按db id查找对象的Dictionary,我使用Lucene.NET返回的id从内存缓存中提取数据。

您还可以放弃内存缓存并存储在搜索索引中显示搜索结果所需的所有属性。我没有这样做,因为内存缓存也用于搜索以外的场景。

内存缓存在几个小时内总是新鲜的,而且我唯一需要访问数据库的时候是我需要为单个对象提取更详细的数据(如果用户点击了链接要转到该对象的页面的特定对象)。