如何在多个字段中使用通配符进行搜索?

How to search with wildcards in multiple fields?

我正在尝试实现基于休眠搜索的搜索。 我设法根据某些条件组合搜索字段,但在这种情况下,我无法使用通配符进行搜索。

    List<String> spalten = new ArrayList<String>();

    FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search
            .getFullTextEntityManager(em);

    QueryBuilder qb = fullTextEntityManager.getSearchFactory()
            .buildQueryBuilder().forEntity(BeitragVO.class).get();

    List<BeitragVO> results;
        // add fields for search
        List<String> fields= new ArrayList<String>();

        if (student) {
            logger.info("hit student");
            spalten.add("user.surname");
            spalten.add("user.givenname");
        }
        if (company) {
            logger.info("hit company");
            spalten.add("company.name");
        }

        for (String string : fields) {
            logger.info(string);
        }
        logger.info("Searchterm:" + searchterm);
        org.apache.lucene.search.Query luceneQuery = qb.keyword()
                .onFields(fields.toArray(new String[fields.size()]))
                .matching(searchterm).createQuery();

        logger.info("Query: " + luceneQuery.toString());

        javax.persistence.Query jpaQuery = fullTextEntityManager
                .createFullTextQuery(luceneQuery, ArticleVO.class);

        results= jpaQuery.getResultList();

在我的搜索输入下,我有六个复选框,用户可以选择或不选择。 如果用户选中学生,则搜索仅适用于学生的 table。这完全没问题!

问题: 搜索输入:Alexan (亚历山大)

没有找到结果!

我试过这样的通配符搜索:

    TermContext tc = qb.keyword();

    WildcardContext wcc = tc.wildcard();
       if (student) {

            TermMatchingContext tmc = wcc.onField("user.surname");
            tmc = tmc.andField("user.givenname");
            luceneQuery = tmc.matching(searchterm).createQuery();
        }

这是正确的语法,我得到了正确的查询 (user.surname:alexander user.givenname: alexander)。但仍然是一个空的结果列表。

我真的很喜欢没有通配符的尝试。有没有办法在这次尝试中添加通配符搜索?

只有 Alexan 会被假定为完全匹配,尝试使用 Alexan*

使用通配符“*”应该可以。实际上,您需要构建如下内容:

qb.keyword()
  .wildcard()
  .onField( "user.givenname" )
  .matching( "Alex*" )
  .createQuery(); 

显然,您需要分解 DSL 以添加一些条件逻辑,但它应该可以工作。您确定示例中的 'searchterm' 添加了通配符吗?

分解 DSL 的另一种方法是创建多个独立的查询并通过 BooleanQuery 组合它们。我认为这会更具可读性。

issue/bug/feature 已修复!你可以在这里看到它:

https://hibernate.atlassian.net/browse/HSEARCH-1811