我想实现一个在数据库中搜索文本的搜索查询。 但是我总是得到一个空的结果,尽管文本出现在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();
}
我不知道为什么结果总是空的。
答案 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}}
我希望它可以帮到你。