一、基礎配置
依賴
<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