我正在实现基于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”得到结果
任何人都可以告诉我该怎么做?
答案 0 :(得分: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