如何在Hibernate Search中使用布尔运算符

Nob*_*Man 8 java hibernate-search

我正在学习Hibernate Search Query DSL,我不知道如何使用AND或OR等布尔参数构造查询.

例如,假设我想要返回firstName值为"bill"或"bob"的所有人员记录.

在hibernate文档之后,一个示例使用bool()方法w /两个子查询,例如:

QueryBuilder b = fts.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
Query luceneQuery = b.bool()
    .should(b.keyword().onField("firstName").matching("bill").createQuery())
    .should(b.keyword().onField("firstName").matching("bob").createQuery())
    .createQuery();

logger.debug("query 1:{}", luceneQuery.toString());
Run Code Online (Sandbox Code Playgroud)

这最终产生了我想要的lucene查询,但这是在hibernate搜索中使用布尔逻辑的正确方法吗?"should()"是否等同于"OR"(类似地,"must()"对应于"AND")?

此外,以这种方式编写查询感觉很麻烦.例如,如果我有一个firstNames的集合可以匹配怎么办?这种类型的查询首先是DSL的良好匹配吗?

San*_*nne 3

是的,你的例子是正确的。布尔运算符被称为should而不是OR,因为它们在Lucene API和文档中的名称,并且因为它更合适:它不仅影响布尔决策,而且还影响结果的评分。

例如,如果您搜索“菲亚特品牌”或“蓝色”汽车,则也会返回菲亚特品牌和蓝色品牌的汽车,并且其得分高于蓝色但非菲亚特品牌的汽车。

它可能会感觉很麻烦,因为它是程序化的并且提供了许多详细的选项。一种更简单的替代方法是使用简单的字符串进行查询并使用QueryParser创建查询。一般来说,解析器对于解析用户输入很有用,编程式解析器更容易处理定义明确的字段;例如,如果您有您提到的集合,则很容易在for循环中构建它。