C# Can';使用filepath作为搜索字段时无法获得搜索结果-Lucene.NET 2.9
我的目标是索引文件的路径,以便以后可以搜索。 我有以下代码:C# Can';使用filepath作为搜索字段时无法获得搜索结果-Lucene.NET 2.9,c#,.net,lucene.net,C#,.net,Lucene.net,我的目标是索引文件的路径,以便以后可以搜索。 我有以下代码: class Program { static void Main(string[] args) { Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex")); Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29); v
class Program
{
static void Main(string[] args)
{
Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex"));
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
writer.Optimize();
writer.Commit();
writer.Close();
String text1 = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt";
WriteDocument(text1);
SearchSomething("C:\\Users\\Marto\\Desktop\\folder1\\file1.txt");
Console.ReadLine();
}
private static void WriteDocument(String text)
{
Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex"));
string[] DEFAULT_STOP_WORDS = { };
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29, DEFAULT_STOP_WORDS);
var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
var doc = new Document();
doc.Add(new Field("path", text, Field.Store.YES, Field.Index.NOT_ANALYZED));//text = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt"
writer.AddDocument(doc);
writer.Optimize();
writer.Commit();
writer.Close();
}
private static void SearchSomething(String searchText)
{
Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex"));
string[] DEFAULT_STOP_WORDS = { };
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_29, DEFAULT_STOP_WORDS);
var parser = new QueryParser(Version.LUCENE_29, "path", analyzer);
Query query = parser.Parse(searchText);
//searchText = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt"
//but query = {C:usersmartodesktopfolder1file1.txt}
var searcher = new IndexSearcher(directory, true);
TopDocs topDocs = searcher.Search(query, 500);
int results = topDocs.ScoreDocs.Length;
Console.WriteLine("Found {0} results", results);
for (int i = 0; i < results; i++)
{
ScoreDoc scoreDoc = topDocs.ScoreDocs[i];
float score = scoreDoc.Score;
int docId = scoreDoc.Doc;
Document doc = searcher.Doc(docId);
Console.WriteLine("Result num {0}, score {1}", i + 1, score);
Console.WriteLine("Text found: {0}\r\n", doc.Get("path"));
}
searcher.Close();
directory.Close();
}
}
类程序
{
静态void Main(字符串[]参数)
{
Directory=FSDirectory.Open(newdirectoryinfo(“LuceneIndex”);
Analyzer Analyzer=新标准分析仪(版本:LUCENE_29);
var writer=new IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED);
writer.Optimize();
writer.Commit();
writer.Close();
String text1=“C:\\Users\\Marto\\Desktop\\folder1\\file1.txt”;
减记文件(文本1);
SearchSomething(“C:\\Users\\Marto\\Desktop\\folder1\\file1.txt”);
Console.ReadLine();
}
私有静态void WriteDocument(字符串文本)
{
Directory=FSDirectory.Open(newdirectoryinfo(“LuceneIndex”);
字符串[]默认值\u停止\u单词={};
Analyzer Analyzer=新的StandardAnalyzer(Version.LUCENE_29,默认停止字);
var writer=new IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED);
var doc=新文档();
doc.Add(新字段(“路径”,文本,Field.Store.YES,Field.Index.NOT_analysis));//text=“C:\\Users\\Marto\\Desktop\\folder1\\file1.txt”
writer.AddDocument(doc);
writer.Optimize();
writer.Commit();
writer.Close();
}
私有静态void SearchSomething(字符串searchText)
{
Directory=FSDirectory.Open(newdirectoryinfo(“LuceneIndex”);
字符串[]默认值\u停止\u单词={};
Analyzer Analyzer=新的StandardAnalyzer(Version.LUCENE_29,默认停止字);
var parser=newqueryparser(Version.LUCENE_29,“path”,analyzer);
Query=parser.Parse(searchText);
//searchText=“C:\\Users\\Marto\\Desktop\\folder1\\file1.txt”
//但是query={C:usersmartodesktopfolder1file1.txt}
var searcher=newindexsearcher(目录,true);
TopDocs TopDocs=searcher.Search(查询,500);
int results=topDocs.ScoreDocs.Length;
WriteLine(“找到{0}个结果”,结果);
对于(int i=0;i
但是当我搜索“C:\Users\Marto\Desktop\folder1\file1.txt”时,查询会删除字符\并且不会返回任何结果
我也尝试使用其他分析仪,但得到了相同的结果。
如果有人能帮助我,我将非常感激 您可以按如下方式创建“路径”字段:
new Field("path", text, Field.Store.YES, Field.Index.NOT_ANALYZED)
您的最后一个参数(Field.Index.NOT_analysisted
)告诉Lucene不要为该字段编制索引。Lucene是基于索引的搜索引擎,所以不索引意味着不可搜索。要解决此问题,只需将此参数更改为Field.Index.analysisted
:
new Field("path", text, Field.Store.YES, Field.Index.ANALYZED)
这是因为您在索引时指定了
Field.Index.NOT\u analysis
,但在搜索时使用了分析器
在lucene中,您需要始终使用索引数据的相同方法进行搜索。当你创建QueryParser时,使用关键字分析器而不是标准分析器,或者在索引时将字段更改为field.Index.analysisted
。好吧,我终于找到了它。
解决方案是使用Field.Index.NOT_分析,以便分析仪不处理它。然后我使用了一个布尔查询
,我添加了一个术语查询
(而不是使用常规的查询
),这样就不必对它进行解析
非常感谢您的想法。解决方案:
class Program
{
static void Main(string[] args)
{
Directory directory = FSDirectory.Open(new DirectoryInfo(this.IndexPath));
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
var writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
writer.Optimize();
writer.Commit();
writer.Close();
String text1 = "C:\\Users\\Marto\\Desktop\\folder1\\file1.txt";
WriteDocument(text1);
SearchSomething("C:\\Users\\Marto\\Desktop\\folder1\\file1.txt");
Console.ReadLine();
}
private static void WriteDocument(String text)
{
Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex"));
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
IndexWriter writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
Document doc = new Document();
doc.Add(new Field("path", text, Field.Store.YES, Field.Index.NOT_ANALYZED));
writer.AddDocument(doc);
writer.Optimize();
writer.Commit();
writer.Close();
}
private static void SearchSomething(String searchText)
{
Directory directory = FSDirectory.Open(new DirectoryInfo("LuceneIndex"));
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_29);
IndexSearcher searcher = new IndexSearcher(directory, true);
int results = 0;
if (searcher.MaxDoc() > 0)
{
BooleanQuery booleanQuery = new BooleanQuery();
Lucene.Net.Search.Query query1 = new WildcardQuery(new Term("path", searchText));
booleanQuery.Add(query1, BooleanClause.Occur.SHOULD);
TopDocs topDocs = searcher.Search(booleanQuery, searcher.MaxDoc());
results = topDocs.ScoreDocs.Length;
Console.WriteLine("Found {0} results", results);
for (int i = 0; i < results; i++)
{
ScoreDoc scoreDoc = topDocs.ScoreDocs[i];
float score = scoreDoc.Score;
int docId = scoreDoc.Doc;
Document doc = searcher.Doc(docId);
Console.WriteLine("Result num {0}, score {1}", i + 1, score);
Console.WriteLine("Text found: {0}\r\n", doc.Get("path"));
}
}
searcher.Close();
directory.Close();
}
}
类程序
{
静态void Main(字符串[]参数)
{
Directory=FSDirectory.Open(newdirectoryinfo(this.indexath));
StandardAnalyzer=新的StandardAnalyzer(版本.LUCENE_29);
var writer=new IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED);
writer.Optimize();
writer.Commit();
writer.Close();
String text1=“C:\\Users\\Marto\\Desktop\\folder1\\file1.txt”;
减记文件(文本1);
SearchSomething(“C:\\Users\\Marto\\Desktop\\folder1\\file1.txt”);
Console.ReadLine();
}
私有静态void WriteDocument(字符串文本)
{
Directory=FSDirectory.Open(newdirectoryinfo(“LuceneIndex”);
StandardAnalyzer=新的StandardAnalyzer(版本.LUCENE_29);
IndexWriter writer=新的IndexWriter(目录、分析器、IndexWriter.MaxFieldLength.UNLIMITED);
单据单据=新单据();
添加文档(新字段(“路径”,文本,Field.Store.YES,Field.Index.NOT_analysis));
writer.AddDocument(doc);
writer.Optimize();
writer.Commit();
writer.Close();
}
私有静态void SearchSomething(字符串searchText)
{
Directory=FSDirectory.Open(newdirectoryinfo(“LuceneIndex”);
StandardAnalyzer=新的StandardAnalyzer(版本.LUCENE_29);
IndexSearcher=newindexSearcher(目录,true);
int结果=0;
if(searcher.MaxDoc()>0)
{
BooleanQuery BooleanQuery=新的BooleanQuery();
Lucene.Net.Search.Query query1=新的通配符查询(新术语(“路径”,searchText));
添加(query1,BooleanClause.occure.SHOULD);
TopDocs TopDocs=searcher.Search(booleanQuery,searcher.MaxDoc());
结果=topDocs.ScoreDocs.Length;
WriteLine(“找到{0}个结果”,结果);
对于(int i=0;i