Hibernate Search 5.5.3 - 按集合大小排序不再有效

时间:2016-06-04 09:01:33

标签: java hibernate-search

我一直在尝试从Hibernate Search 5.5.2迁移到5.5.3,并且我遇到了某个排序字段的问题。这是与5.5.2一起使用的代码(或者它可能没有工作,并且没有抛出错误?)

public class CollectionCountBridge implements MetadataProvidingFieldBridge {

    @Override
    public void configureFieldMetadata(String name, FieldMetadataBuilder builder) {
        builder.field(name, FieldType.INTEGER).sortable(true);
    }

    @Override
    public void set(String name, Object object, Document document, LuceneOptions luceneOptions) {
        if (object == null || (!(object instanceof Collection))) {
            return;
        }
        Collection<?> coll = (Collection<?>) object;
        int size = coll.size();

        IntField field = new IntField(name, size, (luceneOptions.getStore() != Store.NO) ? Field.Store.YES : Field.Store.NO);
        document.add(field);
    }

}

...

@Field(analyze = Analyze.NO, norms = Norms.YES, index = Index.YES)
@FieldBridge(impl = CollectionCountBridge.class)
@IndexedEmbedded
@OneToMany
public Set<MyCollection> getMyCollection() {
    return myCollection;
}

代码实际上将集合的大小存储为可排序字段。这是基于建议我是否需要通过网桥定义可排序字段的文档,然后我必须实现MetadataProvidingFieldBridge以将其标记为可排序。但是,文档仅显示字符串字段的示例,而我需要使用数字字段。 http://docs.jboss.org/hibernate/search/5.5/reference/en-US/html_single/#sortablefield-annotation

因此,在升级到5.5.3后,我开始收到如下错误:

org.hibernate.search.exception.SearchException: HSEARCH000307: Sort type INT is not compatible with string type of field 'myCollection'

我尝试过以各种方式将字段添加到文档中,似乎没有任何效果。我尝试过的一些事情:

luceneOptions.addNumericFieldToDocument(name, size, document);

document.add(new SortedNumericDocValuesField(name, size));
//this throws an error on index
java.lang.IllegalArgumentException: cannot change DocValues type from SORTED_NUMERIC to NUMERIC for field "myCollection"

public class CollectionCountBridge extends NumberBridge

所以,我的问题是,从5.5.3开始,通过网桥向索引添加可排序数字字段的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

看来你在这里遇到了一个错误。对于您的自定义网桥,我们无法正确检测数字编码类型。我已经为此提交了HSEARCH-2292

作为解决方法,您可以在实体中创建一个暴露集合大小的瞬态属性。对于此属性,您添加@Field@SortableField,它们应使用正确的类型向索引添加必填字段。

答案 1 :(得分:1)

事实上,它不是一个错误。

您必须在文档中添加相应的NumericDocValuesField才能启用排序。我们将来会改进这一点,但就目前来说,这就是你必须做的事情。

此外,我不建议您添加与默认字段同名的字段,您可以使用其他字段名称更好地索引集合大小。

您的FieldBridge应如下所示:

public class CollectionCountBridge implements MetadataProvidingFieldBridge {
    private static final String COUNT_SUFFIX = "_count";

    @Override
    public void configureFieldMetadata(String name, FieldMetadataBuilder builder) {
        builder.field(name + COUNT_SUFFIX, FieldType.INTEGER).sortable(true);
    }

    @Override
    public void set(String name, Object object, Document document, LuceneOptions luceneOptions) {
        if (object == null || (!(object instanceof Collection))) {
            return;
        }
        Collection<?> coll = (Collection<?>) object;
        int size = coll.size();

        luceneOptions.addNumericFieldToDocument(name + COUNT_SUFFIX, size, document);
        document.add(new NumericDocValuesField(name + COUNT_SUFFIX, size.longValue()));
    }
}

排序时,使用新的SortField(&#34; myCollection_count&#34;,SortField.Type.LONG)。