![](/img/trans.png)
[英]Searching records using string with special characters not working in Lucene.Net
[英]Searching issue using lucene.Net
我正在嘗試使用Lucene .Net的搜索引擎。 我遵循了網站上的一些文檔,但是由於它無法按預期工作,我可能會錯過一些東西。
這是代碼:
var stringBuilder = new StringBuilder();
var pdfReader = new PdfReader(@"c:\Test\testRoot.pdf");
for (var page = 1; page <= pdfReader.NumberOfPages; page++)
{
stringBuilder.Append(PdfTextExtractor.GetTextFromPage(pdfReader, page) + " ");
}
if (stringBuilder.ToString().Contains("new"))
{
Console.WriteLine("New is present in the text!");
}
const string strIndexDir = @"C:\Index";
Directory indexDir = FSDirectory.Open(strIndexDir);
Analyzer std = new StandardAnalyzer(Version.LUCENE_29);
var idwx = new IndexWriter(indexDir, std, true, IndexWriter.MaxFieldLength.UNLIMITED);
var doc = new Document();
var fdl = new Field("testRoot", stringBuilder.ToString(), Field.Store.YES, Field.Index.ANALYZED);
doc.Add(fdl);
idwx.AddDocument(doc);
idwx.Optimize();
idwx.Dispose();
Console.WriteLine("Indexing Done !");
var parser = new QueryParser(Version.LUCENE_29, "new", std);
var qry = parser.Parse(parser.Field);
Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir));
Searcher srch = new IndexSearcher(IndexReader.Open(directory, true));
TopScoreDocCollector cllstr = TopScoreDocCollector.Create(100, true);
ScoreDoc[] hits = cllstr.TopDocs().ScoreDocs;
for (int i = 0; i < hits.Length; i++)
{
int docId = hits[i].Doc;
float score = hits[i].Score;
Document docy = srch.Doc(docId);
Console.WriteLine(docy.Get("text"));
}
Console.ReadLine();
事實是,新詞出現在我的PDF文本中,因為它出現在'if'中。
但是最后,當我嘗試尋找比賽時,這里什么都沒有。
編輯:
我做了很少的更改,但仍然無法正常工作:
var stringBuilder = new StringBuilder();
var pdfReader = new PdfReader(@"c:\Test\testRoot.pdf");
for (var page = 1; page <= pdfReader.NumberOfPages; page++)
{
stringBuilder.Append(PdfTextExtractor.GetTextFromPage(pdfReader, page) + " ");
}
if (stringBuilder.ToString().Contains("new"))
{
Console.WriteLine("New is present in the text!");
}
const string strIndexDir = @"C:\Index";
Directory indexDir = FSDirectory.Open(strIndexDir);
Analyzer std = new StandardAnalyzer(Version.LUCENE_29);
var idwx = new IndexWriter(indexDir, std, true, IndexWriter.MaxFieldLength.UNLIMITED);
var doc = new Document();
var fdl = new Field("testRoot", stringBuilder.ToString(), Field.Store.YES, Field.Index.ANALYZED);
doc.Add(fdl);
idwx.AddDocument(doc);
idwx.Optimize();
idwx.Commit();
idwx.Dispose();
Console.WriteLine("Indexing Done !");
var parser = new QueryParser(Version.LUCENE_29, "", std);
var qry = parser.Parse("new*");
Directory directory = FSDirectory.Open(new System.IO.DirectoryInfo(strIndexDir));
Searcher srch = new IndexSearcher(IndexReader.Open(directory, true));
var lol = srch.Search(qry, 100);
ScoreDoc[] hits = lol.ScoreDocs;
for (int i = 0; i < hits.Length; i++)
{
int docId = hits[i].Doc;
float score = hits[i].Score;
Document docy = srch.Doc(docId);
Console.WriteLine(docy.Get("testRoot"));
}
謝謝您的幫助:)
嘗試以下任一方法:
var parser = new QueryParser(Version.LUCENE_29, "testRoot", std);
要么:
var qry = parser.Parse("testRoot:new*");
您需要指定要搜索的正確字段。出現的testRoot
是您要查找的字段名稱。 QueryParser
的第二個參數指定要搜索的默認字段。 在您提供的第一個示例中,您將其稱為“ new”,它似乎不是要添加到文檔中的字段的名稱(本質上,在這種情況下,查詢看起來像: new:new
)。 除非您在查詢中指定要搜索的字段,例如myField:findThis
(請參閱查詢解析器語法 ),否則將使用此默認字段進行搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.