在数据库中搜索文本(使用Hibernate Search)

时间:2015-06-30 10:47:03

标签: java hibernate search full-text-search hibernate-search

我想实现一个在数据库中搜索文本的搜索查询。 但是我总是得到一个空的结果,尽管文本出现在DataSet中。

  public List<Object> getSearchVorgangResult( final int mandantId, final String searchValue, final List<Integer> projektIds,
                                              final Field field,
                                              final boolean isGrossKlein )
  {
    final EntityManager em = getEntityManager();

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

    // create native Lucene query unsing the query DSL
    // alternatively you can write the Lucene query using the Lucene query parser
    // or the Lucene programmatic API. The Hibernate Search DSL is recommended though
    final QueryBuilder qb = fullTextEntityManager.getSearchFactory()
        .buildQueryBuilder().forEntity( Vorgang.class ).get();

    final List<String> fieldNames = new ArrayList<>();
    System.out.println( field );
    if ( field == null )
    {
      for ( final Field classField : Vorgang.class.getDeclaredFields() )
      {
        fieldNames.add( classField.getName() );
      }
    }
    else
    {
      fieldNames.add( field.getName() );
    }
    String[] fields = new String[fieldNames.size()];
    fields = fieldNames.toArray( fields );

    final org.apache.lucene.search.Query luceneQuery = qb
        .keyword()
        .onFields( fields ).ignoreAnalyzer()
        .matching( searchValue )
        .createQuery();

    // wrap Lucene query in a javax.persistence.Query
    final javax.persistence.Query jpaQuery =
        fullTextEntityManager.createFullTextQuery( luceneQuery, Vorgang.class );

    // execute search
    return jpaQuery.getResultList();
  }

我不知道为什么结果总是空的。

1 个答案:

答案 0 :(得分:3)

我回答你关于整数字段或一般数字字段的问题。

你必须使用一个hibernate搜索注释,它允许你索引整数或任何数字字段:

NumericRangeQuery<Integer> integerQuery = NumericRangeQuery.newIntRange(yourIntegerFieldName, minValue, maxValue,  minInclusive, maxInclusive);

我不知道@NumericField注释是否可选。 Analyze.No,因为您不需要分析数字字段。

要构建查询,您需要使用lucene NumericRangeQuery,如下所示:

BooleanQuery luceneBooleanQuery = new BooleanQuery(); // creates a boolean query

luceneBooleanQuery.add(integerQuery, BooleanClause.Occur.MUST); // adds integerQuery to luceneBooleanQuery. You can add many queries

如果需要组合多个查询,则必须使用另一个对象lucene BooleanQuery:

javax.persistence.Query jpaQuery =
        fullTextEntityManager.createFullTextQuery(luceneBooleanQuery, Vorgang.class );

最后你可以在你的jpa查询中包含lucene查询

{{1}}

我希望它可以帮到你。