关于Lucene.net 2.9.2.2 中删除索引的若干问题

最近项目中用到了Lucene.net和盘古分词 ,用以支撑前台的搜索需求。

在使用过程中,发现删除不太好用,具体表现在:使用IndexWriter.DeleteDocuments 指定术语(Term)进行删除,在语句执行完后,文件并没有被物理删掉,而是生成了新的.CFS(索引文件)。但是在单元测试中使用IndexWriter.DeleteAll(),却可以正常的删除掉所有文档。

经过多方查证和实验,获得了正确的方法:

1,如果不知道文档(document)的序号(docNum),那就得使用术语(Term)进行文档的指定删除。大部分应用场景,应该都是基于术语删除,原因是方便,不需要先查询一遍。

2,使用术语删除,就需要指定键值对:Field和Value。经过若干次尝试,这个Field是需要被索引才能在删除时使用的,在2.9.2.2中,就是 Field.Index.ANALYZED;这个Value,似乎使用哈希值和字符组合都不能凑效,最好是一个数值串。我的做法是,把唯一的值哈希成10进制数值形式再存储,那么删除就能成功。

3,在执行完所有的IndexWriter.DeleteDocuments操作后,最好是提交并优化一下,最后关闭 IndexWriter,删除就生效了,像这样:

复制代码
try
{
    this.UnLock();
                    
    writerFs = new IndexWriter(directory, new PanGuAnalyzer(), false,
        IndexWriter.MaxFieldLength.UNLIMITED);

    foreach (var item in items)
    {
        Term termID = new Term("ID", item.GetID());
        writerFs.DeleteDocuments(termID);
    }

    writerFs.Commit();
    writerFs.SetUseCompoundFile(true);
    writerFs.Optimize();
}
catch (IOException ex)
{
    Logger.Error(typeof(SearchService), ex);
}
finally
{
    try
    {
        if (writerFs != null)
        {
            writerFs.Close();
        }
    }
}
复制代码

 

在 Delphi 2010 调用 Lucene.Net.dll 函数可以使用 .NET 桥接技术来实现。具体步骤如下: 1. 在 Delphi 创建一个 .NET 桥接单元,用于连接 Lucene.Net.dll。可以使用 Delphi 的 .NET 桥接工具来自动生成这个单元。在 Delphi IDE ,选择“File”->“New”->“.NET Assembly”,然后选择 Lucene.Net.dll 文件,生成一个 .NET 桥接单元。 2. 在 Delphi 2010 创建一个新项目,并将刚才生成的 .NET 桥接单元添加到项目。 3. 在 Delphi 编写代码调用 Lucene.Net.dll 的函数。可以使用 Delphi 的 .NET 桥接技术直接访问 Lucene.Net.dll 的类型和方法。 以下是一个简单的示例代码,演示如何使用 Delphi 2010 调用 Lucene.Net.dll 的函数: ```delphi unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Lucene.Net.Store, Lucene.Net.Analysis.Standard, Lucene.Net.Documents, Lucene.Net.Index; {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); var dir: FSDirectory; analyzer: StandardAnalyzer; writer: IndexWriter; doc: Document; begin dir := TDirectory.GetDirectory('c:\index'); analyzer := TStandardAnalyzer.Create; writer := TIndexWriter.Create(dir, analyzer, True); doc := TDocument.Create; doc.Add(TField.Create('title', 'Delphi', TField.TERM_VECTOR_YES)); doc.Add(TField.Create('body', 'Lucene.Net.dll', TField.TERM_VECTOR_YES)); writer.AddDocument(doc); writer.Commit; writer.Close; analyzer.Close; dir.Close; Memo1.Lines.Add('Document added to index'); end; end. ``` 在这个示例,我们使用 Delphi 2010 调用 Lucene.Net.dll 的 IndexWriter 类来将一个文档添加到索引。我们还使用 Lucene.Net.dll 的 FSDirectory 和 StandardAnalyzer 类来创建索引目录和分析器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值