为什么是Lucene.. NET IndexSearcher返回零结果
本文关键字:返回 结果 IndexSearcher NET Lucene 为什么 | 更新日期: 2023-09-27 18:02:50
我最近开始使用Lucene。. NET和我有一些问题:我使用了IndexWriter
来索引我在C:''TestIndex
中的文档,我猜它是有效的,因为它生成了几个.fnm
, .frq
, .cfx
, .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();
使用luke检查索引以确保它有数据,您还可以执行搜索来验证您的搜索条件
http://www.getopt.org/luke/EDIT(卢克将与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
行中获取错误的字段
确保在索引和搜索时使用相同的分析器(在您的情况下,我猜是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;
表示收集器在执行搜索时首先收集结果,然后通过收集器实例获得评分文档。
您可以尝试显式指定您正在搜索的字段吗?例如:
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需要你告诉它你想在哪个字段(标题,内容…)上运行你的查询