es 實戰 —— spring boot 中使用 Elasticsearch


一、基礎配置

依賴

<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

https://www.cnblogs.com/powerwu/articles/12083998.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM