我正在互联网上积极地搜索一些我知道可以完成的事情的解决方案,但我很沮丧为什么它不能与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搜索支持吗?
1条答案
按热度按时间oalqel3c1#
.keyword()...matching( ... )
的参数不是接受特殊字符的查询。此方法要求传递纯文本。不能在其中使用-
或:
。如果所有这些内容都是由用户直接传递的,并且您确实需要接受运算符的内容,那么可以看看
simpleQueryString()
。如果筛选器是由您自己(开发人员)提供的,则只需使用
bool
查询。在您的情况下: