Hibernate 搜索聚合:countByDocumentType(带有 elaticsearch 后端)
Hibernate search aggregation : countByDocumentType (with elaticsearch backend)
我正在编写一个针对多个索引的简单查询:
//targetIndexes is a list of indexes
searchSession.search(targetIndexes).extension(ElasticsearchExtension.get())
现在我只想要一个“countByDocumentType”。这意味着我想要按索引类型分组的结果数。为此,我的存储索引中已经存在两个字段,但我无法使用休眠搜索查询它们,该死的!
实际上,弹性搜索添加了名为“_index”的原生字段以允许按索引进行过滤。 Hibernate 搜索还添加了其名为“_entity_type”的本机字段。但是我既不能查询“_index”也不能查询“_entity_type”,使用这样的聚合进行休眠搜索:
AggregationKey<Map<String, Long>> countsByEntityKey = AggregationKey.of( "countsByEntity" );
...where(...).aggregation(countsByEntityKey, f -> f.terms()
.field( "_entity_type", String.class ));
所以我真的需要通过在每个休眠映射实体中添加自定义第三个字段来污染我的所有 类 以便能够查询特定索引吗?
@Indexed
public class MyIndexedEntity {
...
@GenericField
public String getEntityName() {
return this.getClass.getName();
}
}
感谢您的回答
您不能在 Hibernate Search DSL 中引用不属于 Hibernate Search 映射的字段 yet。
我建议使用 native aggregation:
AggregationKey<JsonObject> countsByEntityTypeKey = AggregationKey.of( "countsByEntityType" );
SearchResult<Book> result = searchSession.search( Arrays.asList( Book.class, Author.class ) )
.extension( ElasticsearchExtension.get() )
.where( f -> f.matchAll() )
.aggregation( countsByEntityTypeKey, f -> f.fromJson( "{\"terms\":{\"field\": \"_entity_type\"}}" ) )
.fetch( 20 );
JsonObject countsByEntityTypeAsJson = result.aggregation( countsByEntityTypeKey );
Map<String, Long> countsByEntityType = new HashMap<>();
for ( JsonElement bucket: countsByEntityTypeAsJson.get("buckets").getAsJsonArray() ) {
JsonObject bucketObject = bucket.getAsJsonObject();
countsByEntityType.put( bucketObject.get( "key" ).getAsString(),
bucketObject.get( "doc_count" ).getAsLong() );
}
您仍然可以在同一查询中对其他所有内容使用(更简洁的)Hibernate Search API。
我正在编写一个针对多个索引的简单查询:
//targetIndexes is a list of indexes
searchSession.search(targetIndexes).extension(ElasticsearchExtension.get())
现在我只想要一个“countByDocumentType”。这意味着我想要按索引类型分组的结果数。为此,我的存储索引中已经存在两个字段,但我无法使用休眠搜索查询它们,该死的! 实际上,弹性搜索添加了名为“_index”的原生字段以允许按索引进行过滤。 Hibernate 搜索还添加了其名为“_entity_type”的本机字段。但是我既不能查询“_index”也不能查询“_entity_type”,使用这样的聚合进行休眠搜索:
AggregationKey<Map<String, Long>> countsByEntityKey = AggregationKey.of( "countsByEntity" );
...where(...).aggregation(countsByEntityKey, f -> f.terms()
.field( "_entity_type", String.class ));
所以我真的需要通过在每个休眠映射实体中添加自定义第三个字段来污染我的所有 类 以便能够查询特定索引吗?
@Indexed
public class MyIndexedEntity {
...
@GenericField
public String getEntityName() {
return this.getClass.getName();
}
}
感谢您的回答
您不能在 Hibernate Search DSL 中引用不属于 Hibernate Search 映射的字段 yet。
我建议使用 native aggregation:
AggregationKey<JsonObject> countsByEntityTypeKey = AggregationKey.of( "countsByEntityType" );
SearchResult<Book> result = searchSession.search( Arrays.asList( Book.class, Author.class ) )
.extension( ElasticsearchExtension.get() )
.where( f -> f.matchAll() )
.aggregation( countsByEntityTypeKey, f -> f.fromJson( "{\"terms\":{\"field\": \"_entity_type\"}}" ) )
.fetch( 20 );
JsonObject countsByEntityTypeAsJson = result.aggregation( countsByEntityTypeKey );
Map<String, Long> countsByEntityType = new HashMap<>();
for ( JsonElement bucket: countsByEntityTypeAsJson.get("buckets").getAsJsonArray() ) {
JsonObject bucketObject = bucket.getAsJsonObject();
countsByEntityType.put( bucketObject.get( "key" ).getAsString(),
bucketObject.get( "doc_count" ).getAsLong() );
}
您仍然可以在同一查询中对其他所有内容使用(更简洁的)Hibernate Search API。