【问题标题】:Why is the Lucene.NET IndexSearcher returning zero results?为什么 Lucene.NET IndexSearcher 返回零结果?
【发布时间】:2013-03-08 11:01:42
【问题描述】:

我最近开始使用 Lucene.NET,但遇到了一些问题:我使用 IndexWriterC:\\TestIndex 中为我的文档编制索引,我想这很有效,因为它生成了几个 .fnm.frq、@ 987654325@、.tii.tis 文件。

问题是当尝试通过它们进行简单搜索时,我再也没有得到任何结果。下面是我使用的代码,

using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;

//Provide the directory where index is stored
Directory directory = FSDirectory.Open(newSystem.IO.DirectoryInfo(@"C:\\TestIndex")); 

IndexReader indexReader = IndexReader.Open(directory, true);
Searcher indexSearch = new IndexSearcher(indexReader);

Analyzer std = new StandardAnalyzer(Version.LUCENE_29);
QueryParser parser = new QueryParser(Version.LUCENE_29, "text", std);
Query qry = parser.Parse("morning");

// true opens the index in read only mode
Searcher srchr = new IndexSearcher(IndexReader.Open(directory, true));

TopScoreDocCollector cllctr = TopScoreDocCollector.Create(100, true);

ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
srchr.Search(qry, cllctr); 

for (int i = 0; i < hits.Length; i++)
{
    int docId = hits[i].Doc;
    float score = hits[i].Score;
    Document doc = srchr.Doc(docId);
    Console.WriteLine("Searched from Text: " + doc.Get("text"));
}

我尝试了几种方法,但都没有得到任何结果。你有什么主意吗?

下面是索引代码,

IndexWriter indexWriter = 
    new IndexWriter(
        luceneDir, 
        new StandardAnalyzer(Version.LUCENE_29), 
        true, 
        IndexWriter.MaxFieldLength.UNLIMITED);

string[] listOfFiles = Directory.GetFiles(@"C:\Projects\lucene.net-trunk\build\vs2010\demo\MyTestProject\TestDocs");

foreach (string s in listOfFiles)
{
    String content = File.ReadAllText(s);
    Document doc = new Document();
    String title = s;

    // adding title field
    doc.Add(new Field("title", title, Field.Store.YES, Field.Index.NOT_ANALYZED));  
    doc.Add(new Field("content", content, Field.Store.YES, Field.Index.ANALYZED));

    indexWriter.AddDocument(doc);
}

indexWriter.Optimize();
indexWriter.Dispose();

【问题讨论】:

    标签: c# indexing lucene.net


    【解决方案1】:

    使用 luke 检查索引以确保它有数据,您也可以执行搜索以验证您的搜索条件

    http://www.getopt.org/luke/

    编辑 -(Luke 将使用 lucene 和 lucene.net 索引,您需要安装 java 才能使用)

    编辑

    更新线路

    Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", std);
    

    Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "content", std);
    

    您已将默认搜索字段设置为不存在的text

    您还试图在console.write 行中获取错误的字段

    【讨论】:

    • Luke 出现此错误:“格式版本不兼容:2 预期为 1 或更低”编辑 - 我猜我找到了解决方法
    • 好兆头,您可以执行搜索吗?试试“文本:早上”
    • 我正在尝试运行 moreLikeThis。是否需要任何特殊参数来获取文档? StringReader reader = new StringReader(File.ReadAllText(@"C:\Projects\lucene.net-trunk\build\vs2010\demo\MyTestProject\TestDocs\suspicious-document00001.txt")); IndexReader ir = Lucene.Net.Index.IndexReader.Open(directory, true); MoreLikeThis mlt = new MoreLikeThis(ir);查询查询 = mlt.Like(reader);搜索者 srchr = new IndexSearcher(ir); TopDocs topDocs = srchr.Search(query, 10);
    【解决方案2】:

    确保在索引和搜索时使用相同的分析器(在你的情况下,我猜是StandardAnalyzer):

    using Lucene.Net.Analysis;
    using Lucene.Net.Documents;
    using Lucene.Net.Index;
    using Lucene.Net.Store;
    
    ...
    
    Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(@"C:\\TestIndex"));
    
    var writer = new IndexWriter(
        directory, 
        new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), 
        true, 
        new MaxFieldLength(int.MaxValue));
    

    更新

    我使用稍微不同的搜索方法,但无论如何,也许你需要交换这两行:

    ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
    srchr.Search(qry, cllctr); 
    

    这样就变成了:

    srchr.Search(qry, cllctr); 
    ScoreDoc[] hits = cllctr.TopDocs().ScoreDocs;
    

    意味着收集器在执行搜索时首先收集结果,然后您通过收集器实例获取评分文档。

    【讨论】:

    • 下面是我生成索引的代码.. 是一样的:--------------- ---------------------------------- IndexWriter indexWriter = new IndexWriter(luceneDir, new StandardAnalyzer(Version.LUCENE_29),真,IndexWriter.MaxFieldLength.UNLIMITED);
    • 谢谢,还是不行。我怀疑这可能与我的解决方案参考有关,也许我没有适当的设置
    【解决方案3】:

    您能否尝试明确指定您正在搜索的字段?例如:

        Lucene.Net.QueryParsers.QueryParser parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "text", std);
        Lucene.Net.Search.Query qry = parser.Parse("content: morning");
    

    我认为 Lucene 要求您告诉它您要在哪个字段(标题、内容...)上运行查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多