Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate Search 5.5.3-按集合大小排序不再有效_Java_Hibernate Search - Fatal编程技术网

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

Java Hibernate Search 5.5.3-按集合大小排序不再有效,java,hibernate-search,Java,Hibernate Search,我一直在尝试从HibernateSearch5.5.2迁移到5.5.3,但我的一个排序字段遇到了问题。这是使用5.5.2的代码(或者它不工作,只是没有抛出错误?) 我尝试过以各种方式将字段添加到文档中,但似乎没有任何效果。我尝试过的一些事情: luceneOptions.addNumericFieldToDocument(name, size, document); document.add(new SortedNumericDocValuesField(name, size)); //thi

我一直在尝试从HibernateSearch5.5.2迁移到5.5.3,但我的一个排序字段遇到了问题。这是使用5.5.2的代码(或者它不工作,只是没有抛出错误?)

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

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开始,通过桥接器向索引添加可排序数字字段的正确方法是什么?

您似乎遇到了一个错误。对于您的自定义桥,我们无法正确检测数字编码类型。我已经申请了


作为一种解决方法,您可以在实体中创建一个临时属性,以公开集合大小。对于此属性,您可以添加
@Field
@SortableField
,这两个属性应该使用正确的类型将所需字段添加到索引中。

您似乎遇到了一个错误。对于您的自定义桥,我们无法正确检测数字编码类型。我已经申请了


作为一种解决方法,您可以在实体中创建一个临时属性,以公开集合大小。对于此属性,您可以添加
@Field
@SortableField
,它们应该使用正确的类型将所需字段添加到索引中。

事实上,这不是一个bug

您必须在文档中添加相应的NumericDocValues字段以启用排序。我们将在未来改进这一点,但现在,这是你必须做的

此外,我不建议您添加与默认字段同名的字段,您最好使用另一个字段名为集合大小编制索引

您的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()));
    }
}
公共类CollectionCountBridge实现MetadataProvisingFieldBridge{
私有静态最终字符串计数\u后缀=“\u计数”;
@凌驾
public void configureFieldMetadata(字符串名称,FieldMetadataBuilder生成器){
builder.field(name+COUNT\u后缀,FieldType.INTEGER).可排序(true);
}
@凌驾
公共无效集(字符串名称、对象对象、文档文档、LuceneOptions LuceneOptions){
if(object==null | |(!(集合的对象实例))){
返回;
}
Collection coll=(Collection)对象;
int size=coll.size();
luceneOptions.addNumericFieldToDocument(名称+计数后缀、大小、文档);
添加(新的NumericDocValuesField(名称+计数后缀,size.longValue());
}
}

在排序时,使用一个新的SortField(“myCollection_count”,SortField.Type.LONG))。

事实上,它不是一个bug

您必须在文档中添加相应的NumericDocValues字段以启用排序。我们将在未来改进这一点,但现在,这是你必须做的

此外,我不建议您添加与默认字段同名的字段,您最好使用另一个字段名为集合大小编制索引

您的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()));
    }
}
公共类CollectionCountBridge实现MetadataProvisingFieldBridge{
私有静态最终字符串计数\u后缀=“\u计数”;
@凌驾
public void configureFieldMetadata(字符串名称,FieldMetadataBuilder生成器){
builder.field(name+COUNT\u后缀,FieldType.INTEGER).可排序(true);
}
@凌驾
公共无效集(字符串名称、对象对象、文档文档、LuceneOptions LuceneOptions){
if(object==null | |(!(集合的对象实例))){
返回;
}
Collection coll=(Collection)对象;
int size=coll.size();
luceneOptions.addNumericFieldToDocument(名称+计数后缀、大小、文档);
添加(新的NumericDocValuesField(名称+计数后缀,size.longValue());
}
}

在排序时,请使用新的SortField(“myCollection_count”,SortField.Type.LONG))。

非常感谢,现在一切似乎都很好!非常感谢,现在一切似乎都很顺利!
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()));
    }
}