Не удается получить результат поиска при использовании filepath в качестве поля поиска - Lucene.NET 2.9 - PullRequest
1 голос
/ 05 марта 2012

Моя цель - индексировать ПУТЬ файлов, чтобы потом можно было искать.У меня есть следующий код:

 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();
    }

}

Но когда я ищу "C: \ Users \ Marto \ Desktop \ folder1 \ file1.txt", запрос удаляет символы \ и не возвращает никакого результата.

Я также пытаюсь использовать другой анализатор, но получаю тот же результат.Если кто-нибудь может мне помочь, я буду очень благодарен !!!

Ответы [ 4 ]

0 голосов
/ 25 марта 2012

Решение:

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();
    }

}

Спасибо за все идеи !!!

0 голосов
/ 06 марта 2012

Это потому, что вы указали Field.Index.NOT_ANALYZED во время индексации, но вы используете Analyzer во время поиска.

В lucene вам всегда нужно выполнять поиск с использованием того же метода, который вы проиндексировали.При создании QueryParser используйте KeywordAnalyzer, а не StandardAnalyzer, или измените свое поле на Field.Index.ANALYZED во время индексации.

0 голосов
/ 11 марта 2012

Ну наконец-то я понял. Решение использовало Field.Index.NOT_ANALYZED, чтобы анализатор не обрабатывал его. И затем я использовал BooleanQuery, который я добавил TermQuery (вместо обычного Query), чтобы он не анализировался.

Большое спасибо за идеи.

0 голосов
/ 06 марта 2012

Вы создаете свое поле "путь" следующим образом:

new Field("path", text, Field.Store.YES, Field.Index.NOT_ANALYZED)

Ваш последний аргумент (Field.Index.NOT_ANALYZED) говорит Lucene не индексировать это поле.Lucene - это поисковая система, основанная на индексах, поэтому отсутствие индекса означает невозможность поиска.Чтобы исправить это, просто измените этот аргумент на Field.Index.ANALYZED:

new Field("path", text, Field.Store.YES, Field.Index.ANALYZED)
...