Lucene - Эффективный текстовый поиск - PullRequest
3 голосов
/ 17 января 2011

У меня есть индекс, сгенерированный классом pdfbox api LucenePDFDocument.Поскольку индекс содержит только текстовое содержимое, я хочу эффективно искать этот индекс.

Я буду искать в поле «содержание» строку поиска, порядок результатов должен быть от наиболее релевантного к наименее релевантному.Приведенный ниже код действительно отображал файлы со словами искомого текста, например «Какой вы национальности» , но в результатах не было файла, содержащего это полное предложение.

Какой анализатор запросов и запрос я должен использовать для поиска в вышеупомянутом сценарии.

      Query query = new MultiFieldQueryParser(Version.LUCENE_30, fields,
                new StandardAnalyzer(Version.LUCENE_30))
                .parse(searchString);

      TopScoreDocCollector collector = TopScoreDocCollector.create(5,
                false);
        searcher.search(query, collector);
        ScoreDoc[] hits = collector.topDocs().scoreDocs;
        System.out.println("count " + hits.length);
        for (ScoreDoc scoreDoc : hits) {
            int docId = scoreDoc.doc;
            Document d = searcher.doc(docId);
            System.out.println(d.getField("path"));
        }

1 Ответ

1 голос
/ 18 января 2011

Речь идет не о программной части, а о синтаксис запросов Lucene . Для поиска по всей фразе просто заключите ее в двойные кавычки, то есть вместо поиска

What is your nationality

поиск

"What is your nationality"

Без кавычек Lucene находит все документы с каждым отдельным словом, то есть «что», «есть», «ваш» и «национальность» («есть» и «ваш» можно опустить как стоп-слова ) и отсортировать их по общему количеству вхождений в документе, а не только в этой фразе. Так как в TopScoreDocCollector вы задали количество документов для поиска только 5, файл с фразой может не появиться в результатах. Добавление кавычек заставляет Lucene игнорировать все остальные документы без точной фразы.

Также, если вы ищете только в поле «содержание», вам не нужно MultiFieldQueryParser и вместо него можно использовать простой QueryParser.

...