2

Hibernate Search を使用してデータベースにインデックスを付けました。インデックス作成とクエリの両方にカスタム アナライザーを使用しています。トークン化されるべきではない inchikey というフィールドがあります。値の例は次のとおりです。

  • BBBAWACESCACAP-UHFFFAOYSA-N
  • KEZLDSPIRVZOKZ-AUWJEWJLSA-N

Luke でインデックスを調べると、必要に応じてトークン化されていないことを確認できます。

しかし、ウェブアプリで検索しようとすると、インチキーが見つかるものと見つからないものがあります。興味深いことに、これらの inchikeys では、最後のハイフンなしで検索すると検索が機能します。 BBBAWACESCACAP-UHFFFAOYSA N

見つからないインチキーに共通する要素を見つけることができませんでした。

ここで何が起こっているのか分かりますか?

MultiFieldQueryParser を使用して、データベース内のさまざまなフィールドを検索します。

    String[] searchfields = Compound.getSearchfields();
    MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_29, Compound.getSearchfields(), new ChemicalNameAnalyzer());
    //Disable the following if search performance is too slow
    parser.setAllowLeadingWildcard(true);
    FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(parser.parse("searchterms"), Compound.class);
    List<Compound> hits = fullTextQuery.list();

セットアップの詳細については、ティムと私がここに投稿しています。

4

1 に答える 1

2

入力ファイルの最後のエントリが正しくインデックス化されていないことがわかりました。これらはトークン化されています。実際、それらは 2 回インデックス付けされているようです。1 回目はトークン化されず、もう 1 回はトークン化されています。検索すると、トークン化されていないものが見つかりません。

理由はまだわかりませんが、Lucene がまだ最後のエントリのインデックスを作成している間にパーサーが終了し、結果として Lucene がデフォルトのアナライザー (StandardAnalyzer) に戻ったことに関係しているのではないかと思います。犯人を見つけたらまたここに報告します。

@Analyzer(impl = ChemicalNameAnalyzer.class) をフィールドに追加すると問題は解決しますが、私が望むのは、構成で一度定義されたデフォルトのアナライザーを使用した元のセットアップです。

<property name="hibernate.search.analyzer">path.to.ChemicalNameAnalyzer</property>
于 2011-03-30T05:54:05.100 に答える