是否可以在 Hibernate Search 中创建类似于 WHERE NOT IN ( :values ) 的内容?
Is it possible to create something similar to WHERE NOT IN ( :values ) in Hibernate Search?
我正在 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
的 returns 值设置为 1 2 3
而不是过滤掉那些文档。
编辑1:
我发现布尔查询生成器很有用,我创建了调用 not()
的查询,希望它能过滤数据。底层的lucene查询是我所期望的,和我在第一种方法中写的一样,但是lucene仍然returns错误的值。另一方面,用于 lucene 索引查询的 Luke 工具使用此表达式 returns 我所期待的。
编辑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();
我正在 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
的 returns 值设置为 1 2 3
而不是过滤掉那些文档。
编辑1:
我发现布尔查询生成器很有用,我创建了调用 not()
的查询,希望它能过滤数据。底层的lucene查询是我所期望的,和我在第一种方法中写的一样,但是lucene仍然returns错误的值。另一方面,用于 lucene 索引查询的 Luke 工具使用此表达式 returns 我所期待的。
编辑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();