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

时间:2015-02-15 16:03:22

标签: hibernate wildcard hibernate-search

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

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

在我的搜索输入下,我有六个复选框,用户可以查看。 如果用户检查学生,则搜索仅适用于学生的表格。这完全没用!

问题: 搜索输入: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)。但仍然是一个空的结果列表。

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

2 个答案:

答案 0 :(得分:1)

使用通配符'*'它应该可以工作。实际上你需要构建类似的东西:

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

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

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

问题/错误/功能得到修复!你可以在这里看到它:

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

答案 1 :(得分:0)

Alexan 将被视为完全匹配,请尝试使用 Alexan *