一、基礎配置
依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
客戶端配置
spring:
elasticsearch:
rest:
uris: http://localhost:9200
基於 Java Config 的配置
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
// 完整的配置參考 https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.clients.configuration
@Override
@Bean
public RestHighLevelClient elasticsearchClient() {
final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
}
二、元數據對象映射(objects to documents)
常用注解示例
@Data
@Document(indexName = "article", shards = 5, replicas = 1, indexStoreType = "fs", refreshInterval = "-1")
public class Article implements Serializable {
private static final long serialVersionUID = 551589397625941750L;
@Id
private Long id;
private String title;
private String abstracts;
private String content;
@Field(format = DateFormat.date_time, index = true, store = true, type = FieldType.Object)
private Date postTime;
private Long clickCount;
}
注解說明
@Document
@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
public @interface Document {
// 索引名稱(小寫)
String indexName();
// 映射 type(棄用)
@Deprecated
String type() default "";
// 使用服務端配置?(索引創建)
boolean useServerConfiguration() default false;
// 分區數 (索引創建)
short shards() default 1;
// 副本數 (索引創建)
short replicas() default 1;
// 刷新間隔 (索引創建)
String refreshInterval() default "1s";
// 索引存儲類型 (索引創建)
String indexStoreType() default "fs";
// 是否在啟動時創建索引
boolean createIndex() default true;
//Configuration of version management.
VersionType versionType() default VersionType.EXTERNAL;
}
@Field
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {
// 默認為 Java Field 名稱
String name() default "";
// 具體參考 https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html
FieldType type() default FieldType.Auto;
boolean index() default true;
// format 與 pattern 用於定義日期類型
DateFormat format() default DateFormat.none;
String pattern() default "";
// 是否獨立存儲,不需要從 _source 解析,在需要頻繁使用某個字段時使用。
boolean store() default false;
// 索引時分析器
String analyzer() default "";
// 查詢時分析器
String searchAnalyzer() default "";
// 跟 analyzer 類似,只對 keyword 類型的字段有效,只有 char_filter和filter,沒有tokenizer
String normalizer() default "";
}
三、elasticsearchTemplate 操作
默認自動為實體類創建索引,也可以手動創建索引
elasticsearchTemplate.indexOps(Article.class).create();
創建
@PostMapping("/article")
public String save(@RequestBody Article article) {
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(article.getId().toString())
.withObject(article)
.build();
return elasticsearchTemplate.index(indexQuery, IndexCoordinates.of("article"));
}
根據id查詢
@GetMapping("/article/{id}")
public Article findById(@PathVariable("id") Long id) {
return elasticsearchTemplate
.get(id.toString(), Article.class);
}
分頁查詢
@GetMapping("/article/page")
public void page() {
QPageRequest p = QPageRequest.of(1, 10);
Query query = new NativeSearchQueryBuilder()
.withPageable(p)
.build();
SearchHits<Object> search = elasticsearchTemplate.search(query, Object.class);
List<SearchHit<Object>> searchHits = search.toList();
SearchHit<Object> objectSearchHit = searchHits.get(0);
Object content = objectSearchHit.getContent();
}
復雜的查詢
public void anotherQuery() {
String articleTitle = "Spring Data Elasticsearch";
Sort sort = Sort.by("title").descending();
Query searchQuery = new NativeSearchQueryBuilder()
// .withQuery(matchAllQuery())
.withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%"))
.withFilter(boolQuery().must(termQuery("id", "documentId")))
.build();
searchQuery.addSort(sort);
SearchHits<Article> articles =
elasticsearchTemplate.search(searchQuery, Article.class, IndexCoordinates.of("article"));
Article article = articles.getSearchHit(0).getContent();
}
更多介紹
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#elasticsearch.misc
