如何解决是否可以在 Hibernate Search 中创建类似于 WHERE NOT IN ( :values ) 的内容?
我正在 Internet 上积极搜索我知道可以完成的事情的解决方案,但我很沮丧为什么它不能与 Hibernate Search 一起使用。我正在寻找的是类似于 SQL 子句 where not in (1,2,3)
我有两个实体,A 和 B。
@Indexed
public class A
{
@Field
public String field1;
@FieldBridge(impl = LongBridge.class)
public Long field2;
@IndexEmbedded
public Set<B> names;
}
public class B {
@Field
public String field3;
@ContainedIn
public Set<A> names2;
}
我正在使用如下所示的 querybuilder 积极运行搜索:
queryBuilder.keyword()
.fuzzy()
.onFields("field1","names.field3","field2")
.matching(matching+"-field2:(1 2 3)")
.createQuery();
但我认为 matching
并没有将其视为完整的 Lucene 匹配模式。它返回将 field2
设置为 1 2 3
的值,而不是过滤掉这些文档。
编辑 1:
我发现布尔查询构建器很有帮助,我创建了调用 not()
的查询,期望它过滤数据。底层 lucene 查询是我所期望的,和我在第一种方法中写的一样,但是 lucene 仍然返回错误的值。另一方面,使用此表达式进行 lucene 索引查询的 Luke 工具返回了我所期望的。
编辑2:
我做错的是我使用了单个查询和连接值,而 field2
的每个值都应该由另一个布尔连接携带。现在效果很好!
我做错了什么?我应该使用其他机制吗? Hibernate Search 甚至支持它吗?
解决方法
.keyword()...matching( ... )
的参数不是接受特殊字符的查询。此方法期望传递纯文本。您不能在其中使用 -
或 :
。
如果所有这些内容都是由用户直接传递的,并且您确实需要接受运算符的内容,请查看 simpleQueryString()
。
如果过滤器是由您自己(开发人员)提供的,则只需使用 bool
query。
就你而言:
Query includedQuery = queryBuilder.keyword()
.fuzzy()
.onFields("field1","names.field3","field2")
.matching(matching)
.createQuery();
BooleanJunction<?> combinedQueryBuilder = querybuilder.bool();
combinedQueryBuilder.must(includedQuery);
for (String excluded : Arrays.asList("1","2","3")) {
combinedQueryBuilder.mustNot(queryBuilder.keyword()
.fuzzy()
.onField("field2")
.matching(excluded)
.createQuery());
}
Query combinedQuery = combinedQueryBuilder.createQuery();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。