使用 FlaotBridge 进行范围查询的 Hibernate Search

Hibernate Search using FlaotBridge for range queries

我正在使用 hibernate 搜索版本 5。10.x 我想搜索一个 flaot 范围。

我的领域是:

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

在生成 lucene 索引后,生成的索引就像预期的那样 -1.0 和 150.0 之间的值

在路加福音中:

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

        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的值:

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

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

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;