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