lucene 是否可以在Hibernate搜索中创建类似于WHERE NOT IN(:values)的内容?

9rygscc1  于 2022-11-07  发布在  Lucene
关注(0)|答案(1)|浏览(188)

我正在互联网上积极地搜索一些我知道可以完成的事情的解决方案,但我很沮丧为什么它不能与Hibernate搜索一起工作。我正在寻找类似于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,而不是过滤掉那些文档。
EDIT 1:我发现布尔查询生成器是有用的,我已经创建了查询,调用not(),期望它过滤数据。底层的lucene查询是我所期望的,和我在第一种方法中写的一样,但是lucene仍然返回错误的值。另一方面,Luke工具的lucene索引查询与此表达式返回我所期望的。
编辑2:我做错的是我使用了单一查询和串联值,而field2的每个值应该由另一个布尔连接携带。现在它工作得很好!
我做错了什么?我应该使用另一种机制吗?它甚至被Hibernate搜索支持吗?

oalqel3c

oalqel3c1#

.keyword()...matching( ... )的参数不是接受特殊字符的查询。此方法要求传递纯文本。不能在其中使用-:
如果所有这些内容都是由用户直接传递的,并且您确实需要接受运算符的内容,那么可以看看simpleQueryString()
如果筛选器是由您自己(开发人员)提供的,则只需使用bool查询。
在您的情况下:

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();

相关问题