Lucene.NET TextField 未被编入索引

Lucene.NET TextField not being indexed

使用 .NET 6.0 和来自 NuGet 的 Lucene.NET-4.8.0-beta00016

我在从网站实施 quickstart example 时遇到问题。在文档中使用 TextField 时,该字段未编入索引。稍后在 BuildIndex 方法中进行的搜索不会检索到任何结果。如果将 TextField 更改为 StringField,则该示例有效并且搜索 returns 有效结果。

为什么 StringField 有效而 TextField 无效?我读到 StringField 未被分析,但 TextField 被分析,所以这可能与 StandardAnalyzer 有关?

public class LuceneFullTextSearchService {

private readonly IndexWriter _writer;
private readonly Analyzer _standardAnalyzer;

public LuceneFullTextSearchService(string indexName)
{
    // Compatibility version
    const LuceneVersion luceneVersion = LuceneVersion.LUCENE_48;
    string indexPath = Path.Combine(Environment.CurrentDirectory, indexName);
    Directory indexDir = FSDirectory.Open(indexPath);

    // Create an analyzer to process the text 
    _standardAnalyzer = new StandardAnalyzer(luceneVersion);

    // Create an index writer
    IndexWriterConfig indexConfig = new IndexWriterConfig(luceneVersion, _standardAnalyzer)
    {
        OpenMode = OpenMode.CREATE_OR_APPEND,
    };
    _writer = new IndexWriter(indexDir, indexConfig);
}

public void BuildIndex(string searchPath)
{
    Document doc = new Document();
    
    TextField docText = new TextField("title", "Apache", Field.Store.YES); 
    doc.Add(docText);
    
    _writer.AddDocument(doc);

    //Flush and commit the index data to the directory
    _writer.Commit();
    
    // Parse the user's query text
    Query query = new TermQuery(new Term("title", "Apache"));
    
    // Search
    using DirectoryReader reader = _writer.GetReader(applyAllDeletes: true);
    IndexSearcher searcher = new IndexSearcher(reader);
    TopDocs topDocs = searcher.Search(query, n: 2);

    // Show results
    Document resultDoc = searcher.Doc(topDocs.ScoreDocs[0].Doc);
    string title = resultDoc.Get("title");
}
}

StandardAnalyzer includes a LowerCaseFilter,因此您的文本在索引中存储为 lower-case。

但是,当您构建查询时,您使用的文本是“Apache”而不是“apache”,因此它不会产生任何匹配。

// Parse the user's query text
Query query = new TermQuery(new Term("title", "Apache"));

选项 1

小写您的搜索字词。

// Parse the user's query text
Query query = new TermQuery(new Term("title", "Apache".ToLowerInvariant()));

选项 2

QueryParser 与用于构建索引的 相同的 分析器一起使用。

QueryParser parser = new QueryParser(luceneVersion, "title", _standardAnalyzer);
Query query = parser.Parse("Apache");

Lucene.Net.QueryParser package包含几个实现(上面的例子使用了Lucene.Net.QueryParsers.Classic.QueryParser)。