如何在Hibernate Search中将范围查询与关键字查询结合在一起?

拉乌尔:

给定此域模型:

class User { // <- this is the root entity
    @IndexedEmbedded
    private Set<UserSkill> skills = new HashSet<>();
}

class UserSkill {
    @IndexedEmbedded
    private Skill skill;

    @Enumerated
    @Field(bridge = @FieldBridge(impl = EnumAsIntegerBridge.class))
    private UserSkillLevel level;
}

class Skill {
    @Field
    private String name;
}

如何结合使用范围查询和术语查询来搜索具有给定级别特定技能的用户?

我尝试使用此查询来查找具有高级React技能的用户:

var q = new BooleanQuery.Builder();
q.add(queryBuilder.keyword().onField("skills.skill.name").matching("React").createQuery(), BooleanClause.Occur.MUST);
q.add(queryBuilder.range().onField("skills.level").above(UserSkillLevel.ADVANCED.ordinal()).createQuery(), BooleanClause.Occur.MUST);
var finalQuery = q.build();

这将返回什么:

  • 具有React技能的用户(不分级别)并且
  • 具有高级技能或更高技能的用户(与技能名称无关)。

我期望它返回什么:

  • 具有高级或更高反应技能的用户。
烙印:

在您的查询中,您从未提到两个约束(技能名称和技能级别)必须应用于同一技能。这就是为什么您得到此结果。

在Hibernate Search 5中,不支持这种“联接”。最好的办法是在单个字段(连接的)中为技能名称和技能级别建立索引,但这有点麻烦。

在Hibernate Search 6中,支持嵌套字段,可以解决此问题。但是,Hibernate Search 6的API有很大不同。

这是在Hibernate Search 6中实现所需功能的方法。

@Indexed
class User {
    @IndexedEmbedded(storage = ObjectStorage.NESTED) // Notice this change
    private Set<UserSkill> skills = new HashSet<>();
}

class UserSkill {
    @IndexedEmbedded
    private Skill skill;

    @Enumerated
    @GenericField(valueBridge = @ValueBridge(impl = EnumAsIntegerBridge.class)) // This changed too
    private UserSkillLevel level;
}

class Skill {
    @FullTextField(analyzer = "standard") // You will have to define this analyzer, see the getting started guide
    private String name;
}

// New implementation of your bridge
class EnumAsIntegerValueBridge implements ValueBridge<Enum<?>, Integer> {
    @Override
    public Integer toIndexedValue(Enum<?> enum) {
        return enum.ordinal();
    }
}

然后查询:

List<User> hits = Search.session(entityManager).search(User.class)
        .where(f -> f.nested().onField("skills").nest(f.bool()
                .must(f.match().field("skills.skill.name").matching("React"))
                .must(f.range().field("skills.level").atLeast(UserSkillLevel.ADVANCED))))
        .fetchHits(20);

请注意,您将需要更新依赖项(groupId,artifactId和版本)。您可能需要先阅读入门指南

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在SQL中将另一个条件与多个内部联接结合在一起?

如何在SQL中将一个月的工作日与年度假期结合在一起?

如何在Kotlin中将多个Upper Bounds语法与委托语法结合在一起

如何在SAS中将组合在一起的观察分组

如何执行将字符串组合在一起的SQL查询

我如何在Python中将综合与ordereddict结合在一起?

SQLite3如何将IN运算符与LIKE运算符结合在一起以获取与子查询匹配的部分文本?

如何在sql查询的一部分中将两个foreach循环正确地组合在一起?

如何将聚合查询与不同联接结合在一起?

如何将这两个查询结合在一起?(MySQL)

如何将两个不同查询的结果与猫鼬结合在一起?

如何在Kusto中将控制命令与参数化查询结合在一起?

如何在TypeScript中将有区别的联合与函数重载结合在一起

如何在Spark中将STRUCT的所有元素与1000多个元素结合在一起

如何将两个SQL查询与不同的条件组合在一起?

如何在一个解决方案文件中将Angular 9前端与ASP.NET 4.7 API后端结合在一起?

如何在jq中将更新与函数结果结合在一起?

如何在一次收费中将订阅和单次付款结合在一起[Stripe API]?

如何在带有R的for循环中将“ paste”命令与“ ifelse”命令结合在一起?

如何在Django中将2个模型字段结合在一起?

如何在Java android中将两个函数结合在一起

如何在Python中将3个元组组合在一起

如何在disp方法中将变量与字符串结合在一起?

在Hibernate中将多个结果结合在一起

MongoDB Java API-如何将样本聚合与查找查询结合在一起?

如何在熊猫中将布尔索引器与多索引结合在一起?

如何在 Hive SQL 中将与时间相关的事件组合在一起

如何在 BigQuery 中将多个表粘合在一起?

如何在MongoDB中将所有文档的数组字段组合在一起?