Firebird SQL 的全文搜索






4.65/5 (16投票s)
2005 年 3 月 9 日
3分钟阅读

125960

1580
如何使用全文索引搜索存储在 Firebird SQL 数据库中的数据。
引言
在本文中,我们将讨论如何使用 DotLucene 全文搜索引擎来搜索 Firebird 数据库中的数据。我们将重点介绍将索引直接存储在数据库中(解决方案的源代码已附带)。Firebird SQL
Firebird SQL(出色的嵌入式数据库,具有良好的 .NET 支持)目前还没有内置的全文本搜索支持。相反,您需要依赖第三方工具。幸运的是,有一个出色的搜索引擎库可用:DotLucene。它是一个开源的 .NET 库(从 Java 移植而来),可以索引您能够转换为纯文本的任何数据(结构化或非结构化)。初看起来,使用额外的全文库似乎不太优雅。然而,它也有一些优点。让我们快速将其与 MySQL 的内置全文搜索进行比较。
MySQL 全文搜索
与 DotLucene 相比,MySQL 全文搜索存在以下缺点:
- 只能在 MyISAM 表中使用(即不支持事务)。
- 无法浏览索引(请参阅 Luke)。
- 需要在数据库中存储转换后的文本(即,如果要索引 HTML,则需要存储另一个带有剥离 HTML 标签的文本副本)。
- 不支持在结果中高亮查询词。
- 您几乎无法修改源代码进行自定义更改。
- 许可证不允许免费在商业应用程序中使用。
- 据 报道,它在大型数据集上的性能较低。
如何索引数据?
有关使用 DotLucene 索引数据的基本知识,我建议阅读:
- DotLucene:使用 37 行代码为您的内联网或网站提供全文搜索(CodeProject 文章)
- DotLucene 教程
- DotLucene 在线演示
以下适用于索引数据库:
- 您使用的是不同的数据源(显然 ;-)。不是从磁盘读取,而是需要从数据库加载。
- 索引文本时,无需在索引中完整存储,只需将其保留在数据库中。
- 创建一个额外的 Field,其中包含已索引文档的主键(以便以后可以从数据库加载它)。
- 索引 HTML 时,需要剥离 HTML 标签(需要向 DotLucene 提供纯文本)。
将索引存储在哪里?
在服务器上,将索引存储在单独的目录中不成问题(您也可以将其加载到内存中,使搜索速度超快 - 当然,前提是您有足够的内存)。在桌面应用程序中,将索引存储在 Firebird 数据库中可能很有用。
DotLucene 支持一种添加自定义索引存储的机制。所有存储类型(文件系统和内存都是内置的)都实现为从 Lucene.Net.Store.Directory 抽象类派生的类。我创建了一个 Directory 实现,它直接将索引存储在 Firebird SQL 数据库中。
FbDirectory 类
DotLucene 中的所有索引读/写操作都通过 Directory 类进行。新的 FbDirectory 类基于 FSDirectory。文件系统操作被替换为数据库操作。您可以在此处看到我们需要实现的内容。
using System;
namespace Lucene.Net.Store
{
public abstract class Directory
{
public abstract String[] List();
public abstract bool FileExists(String name);
public abstract long FileModified(String name);
public abstract void TouchFile(String name);
public abstract void DeleteFile(String name);
public abstract void RenameFile(String from, String to);
public abstract long FileLength(String name);
public abstract OutputStream CreateFile(String name);
public abstract InputStream OpenFile(String name);
public abstract Lock MakeLock(String name);
public abstract void Close();
}
}
性能提示
- 如果性能是您的主要关注点,请使用标准的 FSDirectory 将索引存储在磁盘上。我的测试表明,数据库存储比文件系统慢两倍。仅在别无选择的情况下才使用数据库存储。
- 使用复合索引格式(IndexWriter.SetUseCompoundFile(true);)。这是 DotLucene 1.4 中的默认设置,但在 1.3 中您需要手动进行。
- 在内存中创建索引,进行优化,然后使用 `FbDirectory.Copy()` 将其保存到磁盘。这仅在您从头开始重建整个索引时才有帮助。
- 如果您正在从桌面应用程序向索引添加文档,请在后台(在单独的线程中)进行。您仍然可以在添加新文档的同时进行搜索。
有用资源
- DotNetFirebird.org:在 .NET 中使用 Firebird SQL
- DotLucene:开源搜索引擎库
- 嵌入式 Firebird:功能齐全的嵌入式数据库,运行时仅需 2 MB
- DotLucene:使用 37 行代码为您的内联网或网站提供全文搜索