Lucene BooleanQuery の間違った結果

アジディエン

さまざまなソースからデータを収集してすばやく検索できるようにするために、Lucene RAMDirectory を作成しました。さまざまなアナライザーとインデックス戦略を理解するために何時間も費やしましたが、場合によっては、クエリの結果が期待どおりにならないことがあります。

デモ クラスは次のとおりです。

class LuceneDemo {

    static final String ANIMAL = "animal";
    static final String PERSON = "person";

    private StandardAnalyzer analyzer = new StandardAnalyzer();

    private IndexSearcher searcher;
    private IndexWriter writer;

    LuceneDemo() {
        Directory ramDirectory = new RAMDirectory();
        IndexWriterConfig config = new IndexWriterConfig(analyzer);
        try {
            writer = new IndexWriter(ramDirectory, config);

            addDocument(createDocument(PERSON, "DR-(frankenstein)"));
            addDocument(createDocument(ANIMAL, "gray fox"));
            addDocument(createDocument(ANIMAL, "island fox"));

            writer.close();
            IndexReader reader = DirectoryReader.open(ramDirectory);
            searcher = new IndexSearcher(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private Document createDocument(String type, String value) {
        Document document = new Document();
        document.add(new TextField("type", type, Field.Store.YES));
        document.add(new TextField("name", value, Field.Store.YES));
        document.add(new StringField("name", value, Field.Store.YES));
        return document;
    }

    private void addDocument(Document document) {
        try {
            writer.addDocument(document);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    List<String> getDocuments(String type, String value) {
        value = "*" + QueryParser.escape(value) + "*";
        try {
            QueryParser queryParser = new QueryParser("name", analyzer);
            queryParser.setAllowLeadingWildcard(true);
            queryParser.setDefaultOperator(QueryParser.Operator.AND);

            BooleanQuery.Builder query = new BooleanQuery.Builder();
            query.add(new TermQuery(new Term("type", type)), BooleanClause.Occur.MUST);
            query.add(queryParser.parse(value), BooleanClause.Occur.MUST);

            TopDocs docs = searcher.search(query.build(), 10);

            return Arrays.stream(docs.scoreDocs).map(scoreDoc -> {
                try {
                    return searcher.doc(scoreDoc.doc).get("name");
                } catch (IOException e) {
                    return "";
                }
            }).collect(Collectors.toList());
        } catch (ParseException | IOException e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }
}

「ox」、「gray fox」、または「-(frankenstein)」を検索すると、コードはかなりうまく機能します。しかし、「DR-(フランケンシュタイン)」の検索結果はありません。私が何を間違えたのかわかりません。したがって、提案は大歓迎です。

// OK
luceneDemo.getDocuments(LuceneDemo.ANIMAL, "ox").forEach(System.out::println);
luceneDemo.getDocuments(LuceneDemo.ANIMAL, "gray fox").forEach(System.out::println);
luceneDemo.getDocuments(LuceneDemo.PERSON, "-(frankenstein)").forEach(System.out::println);

// NOT OK
luceneDemo.getDocuments(LuceneDemo.PERSON, "DR-(frankenstein)").forEach(System.out::println);
ダルキュラ

これがドキュメントのインデックス作成方法です -

  1. doc#1 type :person name :dr name :frankenstein name :DR-(frankenstein) (注: StringField はトークン化されず、小文字に変換されません)
  2. doc#2 type :動物の名前:灰色の名前:キツネの名前:灰色のキツネ
  3. doc#3 type :動物の名前:島の名前:キツネの名前:島のキツネ

基本的StringFieldに、analyzerトークン化せず、大文字と小文字を区別せずに- に関係なくフィールドにインデックスを付けます一方、読者はStandardAnalyzerすべての検索で大文字と小文字を区別して使用しています。したがって、「DR-(フランケンシュタイン)」を検索すると、一致しない「dr-(フランケンシュタイン)」が検索されます。

StandardAnalyzer を使用してコードを機能させるには、StringField に小文字のインデックスを付ける必要があります。

document.add(new StringField("name", value.toLowerCase(), Field.Store.YES));

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

booleanqueryを使用したluceneランキング-ヒットの品質の決定

分類Dev

LuceneでBooleanQuery.Builderを使用してBooleanQuery.combine

分類Dev

BooleanQueryのTermの配列をLucene.Netと効率的に組み合わせる方法は?

分類Dev

Org.apache.lucene.search.BooleanQuery $ TooManyClausesとしての例外:maxClauseCountがXXXXに設定されている

分類Dev

Lucene 5.3.xでBooleanQueryビルダーを使用する方法

分類Dev

Lucene 6.0!BooleanQueryをインスタンス化し、その中に他の検索クエリを追加する方法は?

分類Dev

Luceneの検索結果

分類Dev

Lucene空間、精度

分類Dev

LuceneのRuby代替

分類Dev

LuceneのPorterStemmer

分類Dev

LuceneのWordnetSynonymParser

分類Dev

Lucene、MoreLikeThisの代替?

分類Dev

Magento Lucene SearchException-間違ったsegments.genファイル形式

分類Dev

strtotimeのPHPの間違った結果

分類Dev

0.9972のNumberFormatterの間違った結果

分類Dev

Joda Time toDate()の間違った結果

分類Dev

SciPymedfiltの間違った結果

分類Dev

sizeofの間違った結果

分類Dev

Pythonの間違った乗算結果

分類Dev

sympy統合の間違った結果

分類Dev

間違ったクイズの結果

分類Dev

間違った式の結果linq

分類Dev

qSinとqCosの間違った結果

分類Dev

array_sumPHPの間違った結果

分類Dev

Python。間違った結果

分類Dev

Luceneクエリ構文を使用したAzureSearchが誤った結果を返す

分類Dev

クエリ文字列間違ったLucene構文を使用したクエリ

分類Dev

SolrとLuceneの違い

分類Dev

間違った結果でMySQL結合

Related 関連記事

ホットタグ

アーカイブ