在数据库中搜索文本(使用 Hibernate Search)
Search in database for text (with Hibernate Search)
我想实现一个搜索查询,在数据库中搜索文本。
但是我总是得到一个空的结果,尽管文本出现在数据集中。
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();
}
我不知道为什么结果总是空的。
我回答你关于整数字段或一般数字字段的问题。
您必须使用允许您索引整数或任何数字字段的休眠搜索注释:
@FieldBridge(impl=IntegerNumericFieldBridge.class)
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO) @NumericField
private Integer integerValue;
我不知道@NumericField 注释是否可选。
Analyze.No 因为您不需要分析数字字段。
要构建查询,您需要像这样使用 lucene NumericRangeQuery:
NumericRangeQuery<Integer> integerQuery = NumericRangeQuery.newIntRange(yourIntegerFieldName, minValue, maxValue, minInclusive, maxInclusive);
如果您需要组合多个查询,则必须使用另一个对象,即 lucene BooleanQuery :
BooleanQuery luceneBooleanQuery = new BooleanQuery(); // creates a boolean query
luceneBooleanQuery.add(integerQuery, BooleanClause.Occur.MUST); // adds integerQuery to luceneBooleanQuery. You can add many queries
最后你可以在你的 jpa 查询中包装 lucene 查询
javax.persistence.Query jpaQuery =
fullTextEntityManager.createFullTextQuery(luceneBooleanQuery, Vorgang.class );
希望对您有所帮助。
我想实现一个搜索查询,在数据库中搜索文本。 但是我总是得到一个空的结果,尽管文本出现在数据集中。
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();
}
我不知道为什么结果总是空的。
我回答你关于整数字段或一般数字字段的问题。
您必须使用允许您索引整数或任何数字字段的休眠搜索注释:
@FieldBridge(impl=IntegerNumericFieldBridge.class)
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO) @NumericField
private Integer integerValue;
我不知道@NumericField 注释是否可选。 Analyze.No 因为您不需要分析数字字段。
要构建查询,您需要像这样使用 lucene NumericRangeQuery:
NumericRangeQuery<Integer> integerQuery = NumericRangeQuery.newIntRange(yourIntegerFieldName, minValue, maxValue, minInclusive, maxInclusive);
如果您需要组合多个查询,则必须使用另一个对象,即 lucene BooleanQuery :
BooleanQuery luceneBooleanQuery = new BooleanQuery(); // creates a boolean query
luceneBooleanQuery.add(integerQuery, BooleanClause.Occur.MUST); // adds integerQuery to luceneBooleanQuery. You can add many queries
最后你可以在你的 jpa 查询中包装 lucene 查询
javax.persistence.Query jpaQuery =
fullTextEntityManager.createFullTextQuery(luceneBooleanQuery, Vorgang.class );
希望对您有所帮助。