是否可以在 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();