65.9K
CodeProject 正在变化。 阅读更多。
Home

Firebird SQL 的全文搜索

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (16投票s)

2005 年 3 月 9 日

3分钟阅读

viewsIcon

125960

downloadIcon

1580

如何使用全文索引搜索存储在 Firebird SQL 数据库中的数据。

引言

在本文中,我们将讨论如何使用 DotLucene 全文搜索引擎来搜索 Firebird 数据库中的数据。我们将重点介绍将索引直接存储在数据库中(解决方案的源代码已附带)。

Firebird SQL

Firebird SQL(出色的嵌入式数据库,具有良好的 .NET 支持)目前还没有内置的全文本搜索支持。相反,您需要依赖第三方工具。幸运的是,有一个出色的搜索引擎库可用:DotLucene。它是一个开源的 .NET 库(从 Java 移植而来),可以索引您能够转换为纯文本的任何数据(结构化或非结构化)。初看起来,使用额外的全文库似乎不太优雅。然而,它也有一些优点。让我们快速将其与 MySQL 的内置全文搜索进行比较。

MySQL 全文搜索

DotLucene 相比,MySQL 全文搜索存在以下缺点:

  • 只能在 MyISAM 表中使用(即不支持事务)。
  • 无法浏览索引(请参阅 Luke)。
  • 需要在数据库中存储转换后的文本(即,如果要索引 HTML,则需要存储另一个带有剥离 HTML 标签的文本副本)。
  • 不支持在结果中高亮查询词。
  • 您几乎无法修改源代码进行自定义更改。
  • 许可证不允许免费在商业应用程序中使用。
  • 报道,它在大型数据集上的性能较低。

如何索引数据?

有关使用 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();
    }
}

性能提示

  1. 如果性能是您的主要关注点,请使用标准的 FSDirectory 将索引存储在磁盘上。我的测试表明,数据库存储比文件系统慢两倍。仅在别无选择的情况下才使用数据库存储。
  2. 使用复合索引格式(IndexWriter.SetUseCompoundFile(true);)。这是 DotLucene 1.4 中的默认设置,但在 1.3 中您需要手动进行。
  3. 在内存中创建索引,进行优化,然后使用 `FbDirectory.Copy()` 将其保存到磁盘。这仅在您从头开始重建整个索引时才有帮助。
  4. 如果您正在从桌面应用程序向索引添加文档,请在后台(在单独的线程中)进行。您仍然可以在添加新文档的同时进行搜索。

有用资源

© . All rights reserved.