如何使用Hibernate Lucene搜索完整的短语和单个术语?

时间:2016-07-28 10:55:22

标签: java hibernate lucene hibernate-search

早些时候我们正在寻找像#David;父亲David Azrael"。它返回所有结果名称,包括术语父亲或大卫或Azrael。

以下是图片中的代码:

String[] FIELDS =  { "id", "person.firstName", "person.middleName", "person.lastName" };
for (String field : FIELDS) {
           for (String match : pattern) {     
                   bool.should(qb.keyword().wildcard().onField(field).matching(match).createQuery());
           }
        }
        query = bool.createQuery();

除上述情况外,现在还有另外一项要求,即如果最终用户想要搜索"父亲David Azrael&#34 ;;他应该只得到一个结果。

意味着如果我们搜索"父亲David Azrael&#34 ;;然后只会出现具有此名称的结果,但如果用户搜索"父亲Azrael"然后它应该像现在一样工作。

那么上面的代码需要做些什么改变才能实现呢?

1 个答案:

答案 0 :(得分:0)

您可以使用词组查询,如文档的section 5.1.2.4所示:

bool.should(qb
    .phrase()
    .onField(field)
    .sentence("Father David Azrael")
    .createQuery());

我不知道你的意思和#34; David Azrael神父"被对待的方式不同于父亲Azrael",所以我不会对那部分发表评论,但这就是你如何创建一个短语查询。您可以将短语与现有的通配符查询组合,方法是将两者都添加到布尔查询中以获取两组结果,短语匹配通常会获得最高分数。或者您可以先运行短语查询,然后在没有结果的情况下返回通配符查询。