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 回答