3

pdfbox api class によって生成されたインデックスがありますLucenePDFDocument。索引にはテキストの内容しか含まれていないため、この索引を効率的に検索したいと考えています。

検索文字列を使用して「コンテンツ」フィールドを検索します。結果の順序は、関連性の高いものから関連性の低いものの順に並べる必要があります。以下のコードは、検索されたテキストの単語を含むファイルを表示しました。たとえば、 'What is your nationality'ですが、結果にはこの完全な文を含むファイルが含まれていませんでした。

上記のシナリオで検索するには、どのクエリパーサーとクエリを使用する必要がありますか。

      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"));
        }
4

1 に答える 1

1

それはプログラム的な部分ではなく、Lucene quesry syntaxに関するものです。フレーズ全体を検索するには、二重引用符で囲みます。つまり、検索する代わりに

What is your nationality

探す

"What is your nationality"

引用符がない場合、Lucene は、"what"、"is"、"your"、"nationality" ("is" と "your" はストップ ワードとして省略される場合があります) などの単語を含むすべてのドキュメントを検索し、全体の出現回数で並べ替えます。そのフレーズだけでなく、ドキュメントで。で検索するドキュメントの数を 5 だけに設定したためTopScoreDocCollector、このフレーズを含むファイルが検索結果に表示されない場合があります。引用符を追加すると、正確なフレーズのない他のすべてのドキュメントを Lucene が無視するようになります。

また、'contents' フィールドのみを検索する場合は、その必要はなくMultiFieldQueryParser、代わりに simple を使用できますQueryParser

于 2011-01-18T14:15:02.847 に答える