我的Lucene代码出了什么问题?

时间:2017-03-07 18:43:41

标签: lucene lucene.net

我有一系列可搜索的术语,我想通过这堆文件基本上使用Lucene CTRL-F,并在该堆文档中查找并存储所有这些术语的位置。例如:

条款:“A”,“B”,“C”

Doc1:“创造” Doc2:“一辆大车” Doc3:“DOUBLE TROUBLE”

如果我查询字母“A”,我希望能够说有3个“A”:

  • 位置4的Doc1
  • 位置1的Doc2
  • 位置8的Doc2

这样的事情。我怎样才能做到这一点?到目前为止,我只是使用像这样的StandardAnalyzer:

public Analyzer _analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);

// for some directory defined here

using (var indexWriter = new IndexWriter(directory, _analyzer, true, new IndexWriter.MaxFieldLength(IndexWriter.DEFAULT_MAX_FIELD_LENGTH)))
{
    using (var textReader = new StreamReader(blobStream))
    {
        // this code should analyze and write my indexes to the lucene instance

        var text = await textReader.ReadToEndAsync();
        var document = new Document();
        document.Add(new Field("Text", text, Field.Store.NO, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS));
        document.Add(new Field("DocId", docId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
        document.Add(new Field("FamilyId", familyId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
        indexWriter.AddDocument(document);
    }
}

Lucene最初生成了大量文档,但随后删除了除.cfs文件之外的所有文档。如何保留其他文件以进行查询?

1 个答案:

答案 0 :(得分:0)

要对任意字符位置编制索引,您可以使用NGramTokenizer。在创建索引时,您还应使用FieldType.setStoreTermVectors(true);FieldType.setStoreTermVectorPositions(true);,以便实际存储术语的位置。请查看具有正确代码的question,以检索问题中已有的术语位置。