ElasticSearch Operations
Spring Data Elasticsearch 使用多个接口来定义针对 ES 索引调用的操作。
IndexOperations
- 在索引级别定义操作,如创建、删除索引DocumentOperations
- 根据其ID存储,更新和检索实体的操作SearchOperations
- 查询搜索多个实体ElasticsearchOperations
结合DocumentOperations
和SearchOperations
。
这些接口对应 ES API 的结构,默认提供:
- 索引管理功能
- 对域类型的读/写映射支持
- 丰富的查询条件API
- 资源管理和异常转换
一、ElasticsearchTemplate
ES 4.0 开始不推荐使用 ElasticsearchTemplate,这里就不做赘述了。
请改用 ElasticsearchRestTemplate。
二、ElasticsearchRestTemplate
ElasticsearchRestTemplate
是 ElasticsearchOperations
的接口实现。因此配置好 High Level REST Client
即可使用。
配置如下:
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
@Bean
@Override
public RestHighLevelClient elasticsearchClient() {
ClientConfiguration build = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
return RestClients.create(build).rest();
}
}
三、用法示例
@RestController
@RequestMapping("/api/demo")
public class DemoController {
private final ElasticsearchRestTemplate template;
public DemoController(@Qualifier("elasticsearchRestTemplate") ElasticsearchRestTemplate template) {
this.template = template;
}
@Getter
@Setter
@Document(indexName = "person")
public static class Person {
private String id;
private String name;
private Integer age;
}
@PostMapping("/person")
public String save(@RequestBody Person person) {
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(person.getId())
.withObject(person)
.build();
return template.index(indexQuery);
}
@GetMapping("/person/{id}")
public Person findById(@PathVariable String id) {
return template.queryForObject(GetQuery.getById(id), Person.class);
}
}
四、搜索结果类型
使用 DocumentOperations
接口的方法检索文档时,仅返回找到的实体。而使用 SearchOperations
的方法搜索时,会返回实体的其它信息,如实体的 score 等。
SearchHit
- ID
- Score,匹配度得分
- Sort Values,排序值
- Highlight Fields,高亮字段
- 类型为 T 的实体
SearchHits
- 实体总数
- 总匹配度
- 最高分数
- 对象列表 SeachHit
- 返回的聚合
SearchPageSearchHits<T>
元素
SearchScrollHits
SearchHitsIterator