1

hibernate search3.2 をベースにブック検索機能を実装しています。

Book オブジェクトには、authornames というフィールドが含まれています。Authornames の値は名前のリストで、コンマは区切り文字です。たとえば、「John Will、Robin Rod、James Timerberland」などです。

@Field(index = org.hibernate.search.annotations.Index.UN_TOKENIZED,store=Store.YES)
@FieldBridge(impl=CollectionToCSVBridge.class)
private Set<String> authornames;

それぞれの名前を UN_TOKENIZED にする必要があるため、ユーザーは単一の著者名 (John Will、Robin Rod、または James Timerberland) で本を検索します。

Luke を使用してインデックスを確認し、authornames フィールドの値は「John Will、Robin Rod、James Timerberland」として格納されていますが、「authornames:John Will」をクエリしても結果を取得できません。

どうすればそれを行うことができますか?

4

1 に答える 1

1

CollectionToCSVBridgeは、より大きな文字列ですべての名前を「、」で連結していると思います。代わりにそれらを別々に保ち、各要素を個別にインデックスに追加する必要があります。

@Override
public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
    if ( value == null ) {
        return;
    }
    if ( !( value instanceof Collection ) ) {
        throw new IllegalArgumentException( "This FieldBridge only supports collections." );
    }
    Collection<?> objects = (Collection<?>) value;

    for ( Object object : objects ) {
        luceneOptions.addFieldToDocument( name, objectToString( object ), document ); // in your case objectToString could do just a #toString
    }
}

https://forum.hibernate.org/viewtopic.php?f=9&t=1015286&start=0も参照してください。

于 2012-05-02T17:08:50.030 に答える