使用 FlaotBridge 进行范围查询的休眠搜索

时间:2021-02-02 08:53:07

标签: java lucene hibernate-search

我使用的是休眠搜索版本 5.10.x,我想搜索一个浮动范围。

我的领域是:

@Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
@FieldBridge(impl = FloatBridge.class)
private Float minusPunkte = -1f;

生成 lucene 索引后,生成的索引就像预期的一样,介于 -1.0 和 150.0 之间

在卢克:

enter image description here

要搜索我使用的一系列值:

        Float lowerTermFloat = null,
                upperTermFloat = null;
        try {
            lowerTermFloat = StringUtils.isEmpty(lowerTerm) ? null : Float.parseFloat(lowerTerm);
            upperTermFloat = StringUtils.isEmpty(upperTerm) ? null : Float.parseFloat(upperTerm);
        } catch (NumberFormatException e) {
            throw new HibernateSearcheParseException();
        }
        return NumericRangeQuery.newFloatRange(path, 4, lowerTermFloat, upperTermFloat, includeLower, includeUpper);

这将生成 lucene 的搜索字符串:

+totalPunkte:[120.0 TO *}

如果我想让所有条目都大于 120

但结果中也有小于 120 的值:

enter image description here

看起来,它搜索的是字符串值,而不是浮点值!

但是为什么 FloatBridge 不从浮点值生成可比较的字符串值?我怎么了?我需要自己的 Bridge 来比较浮点值吗?

1 个答案:

答案 0 :(得分:1)

FloatBridge 是一个遗留的桥梁,早在 Lucene 不支持数字值的时候就开始了。请参阅其 javadoc:

/**
 * Bridge a {@link Float} to a {@link String}.
 *
 * @see NumericFieldBridge#FLOAT_FIELD_BRIDGE
 * @author Emmanuel Bernard
 */

要将浮点数索引为浮点数而不是字符串,根本不指定桥接器。默认情况下,Hibernate Search 会做正确的事情。

因此,您的映射变为:

@Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
private Float minusPunkte = -1f;