国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot集成elasticsearch7.17.3

這篇具有很好參考價值的文章主要介紹了springboot集成elasticsearch7.17.3。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


環(huán)境:
jdk1.8
springboot: 2.7.0

spring elastisearch官方文檔

一、依賴配置

1、引入es依賴

        <!-- spring data es -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
                <!-- https://mvnrepository.com/artifact/jakarta.json/jakarta.json-api -->
        <dependency>
            <groupId>jakarta.json</groupId>
            <artifactId>jakarta.json-api</artifactId>
            <version>2.0.1</version>
        </dependency>

2、配置文件application.yaml

spring:
  elasticsearch:
    uris: http://1.13.152.218:9200
    username:
    password:
    connection-timeout: 10s
  jackson:
    date-format: "yyyy-MM-dd HH:mm:ss"

二、使用Repository對es增刪改查

1、定義實體類 Book

package com.zhuang.es.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.Date;
import java.util.List;
import java.util.Map;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName="books")
public class Book {
    @Id
    private Long id;

    @Field(type = FieldType.Text)
    private String name;

    @Field(type = FieldType.Text)
    private String summary;

    @Field(type = FieldType.Double)
    private Double price;

    @Field(type = FieldType.Text)
    private String parent;

    private List<Long> list;

    private Map<Long, String> map;

    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
    private Date create;
}

2、注解:

@Document

作用:標識要持久化到Elasticsearch的域對象, 如定義索引名
@Document(indexName="books")

@Id

作用:定義標識符 -> 文檔id
@Id private Long id;

@Field

作用:對持久化到Elasticsearch域的屬性設置, 比如設置對應es中字段的屬性類型

type屬性類型:

1、如果沒有定義屬性的type或者type = FieldType.Auto ,會動態(tài)映射 type,會在第一次插入數(shù)據(jù)時動態(tài)設置屬性類型。如 private String name; 或 如 @Field(type = FieldType.Auto) private String name;

2、如果顯示定義了type的類型,那么在項目啟動的時候,就會在es中創(chuàng)建定義的類型
@Field(type = FieldType.Text) private String name; 那么name屬性在es中的屬性類型為text

format日期格式:

1.使用自帶的日期格式:format
@Field(type = FieldType.Date, format = DateFormat.date_hour_minute_second) private Date create DateFormat是枚舉類型;
2.自定義時間類型:pattern
設置format = DateFormat.custom或 format = DateFormat.none,
如: @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss") private Date create;

3、創(chuàng)建接口 BookRepository

繼承 ElasticsearchRepository<T, ID>, T為映射的實體類, ID為標記的id類型

package com.zhuang.es.service;

import com.zhuang.es.entity.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

public interface BookRepository extends ElasticsearchRepository<Book, Long> {
}

4、創(chuàng)建 BookController

注入BookRepository bean,調用封裝好的增刪改查接口

package com.zhuang.es.controller;

import com.zhuang.es.entity.Book;
import com.zhuang.es.service.BookRepository;
import com.zhuang.es.vo.BookVo;
import com.zhuang.es.vo.ResponseVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;

/**
 * @program: mybatis-plus
 * @description:
 * @author: mrzhuang
 * @create: 2022-12-23 21:14
 **/

@RestController
@RequestMapping("/book")
public class BookController {

    @Resource
    BookRepository bookRepository;

    /**
     * 查詢?nèi)?     *
     * @return /
     */
    @GetMapping("/findAll")
    public ResponseVo<Iterable<Book>> findAll() {
        Iterable<Book> books = bookRepository.findAll();
        return new ResponseVo<>(books);
    }

    /**
     * 向es中增加book
     *
     * @param book /
     * @return /
     */
    @PostMapping("/add")
    public ResponseVo<Book> addBook(@RequestBody Book book) {
        Book save = bookRepository.save(book);
        return new ResponseVo<>(save);
    }

    /**
     * 根據(jù)id查詢
     *
     * @param id /
     * @return /
     */
    @GetMapping("/findById")
    public ResponseVo<Optional<Book>> findById(@RequestParam("id") Long id) {
        Optional<Book> bookOptional = bookRepository.findById(id);
        return new ResponseVo<>(bookOptional);

    }

    /**
     * 通過傳入實體刪除
     *
     * @param book /
     * @return /
     */
    @PostMapping("/delete")
    public ResponseVo<Boolean> delete(@RequestBody Book book) {
        bookRepository.delete(book);
        return new ResponseVo<>(true);
    }

    /**
     * 通過id刪除
     *
     * @param id /
     * @return /
     */
    @GetMapping("/deleteById")
    public ResponseVo<Boolean> delete(@RequestParam("id") Long id) {
        bookRepository.deleteById(id);
        return new ResponseVo<>(true);
    }

  /**
     * 更新某個屬性值(如:name)
     * @param bookVo /
     */
    @PostMapping("/update")
    public ResponseVo<Book> update(@RequestBody BookVo bookVo) {
        //獲取需要更新的文檔id
        Long id = bookVo.getId();
        Optional<Book> option = bookRepository.findById(id);
        if (option.isPresent()) {
            Book book = option.get();
            if (StringUtils.isNotEmpty(bookVo.getName())) {
                book.setName(bookVo.getName());
            }
            Book save = bookRepository.save(book);
            return new ResponseVo<>(book);
        }
        return new ResponseVo<>(CodeEnum.FAILUIRE.code, "更新失??!");
    }

    /**
     * 統(tǒng)計數(shù)量
     *
     * @return /
     */
    @GetMapping("/count")
    public ResponseVo<Long> count() {
        long count = bookRepository.count();
        return new ResponseVo<>(count);
    }

    /**
     * 查看id是否存在
     * @param id /
     * @return /
     */
    @GetMapping("/existsById")
    public ResponseVo<Boolean> update(@RequestParam("id") Long id) {
        boolean exists = bookRepository.existsById(id);
        return new ResponseVo<>(exists);
    }

    /**
     * 根據(jù)name和price查詢
     * @param name /
     * @param price /
     * @return /
     */
    @GetMapping("/findByNameAndPrice")
    public ResponseVo<List<Book>> findByNameAndPrice(@RequestParam("name") String name, @RequestParam("price") Double price) {
        List<Book> books = bookRepository.findByNameAndPrice(name, price);
        return new ResponseVo<>(books);
    }

    /**
     * 根據(jù)summary和parent查詢
     * @param summary /
     * @param parent /
     * @return /
     */
    @GetMapping("/findBySummaryAndParent")
    public ResponseVo<List<Book>> findBySummaryAndParent(@RequestParam("summary") String summary, @RequestParam("parent") String parent) {
        List<Book> books = bookRepository.findBySummaryAndParent(summary, parent);
        return new ResponseVo<>(books);
    }
    

}

5、Es創(chuàng)建查詢機制

通常,Elasticsearch 的查詢創(chuàng)建機制按照查詢方法中的描述工作。

以下是 Elasticsearch 查詢方法轉換成的簡短示例:
增加方法: List<Book> findByNameAndPrice(String name, Double price);
上面的方法名會被翻譯成下面的 Elasticsearch json 查詢:

{
    "query": {
        "bool" : {
            "must" : [
                { "query_string" : { "query" : "?", "fields" : [ "name" ] } },
                { "query_string" : { "query" : "?", "fields" : [ "price" ] } }
            ]
        }
    }
}
package com.zhuang.es.service;

import com.zhuang.es.entity.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

public interface BookRepository extends ElasticsearchRepository<Book, Long> {
    List<Book> findByNameAndPrice(String name, Double price);
}

controller層中調用

    @PostMapping("/findByNameAndPrice")
    public ResponseVo<List<Book>> findByNameAndPrice(@RequestParam("name") String name, @RequestParam("price") Double price){
        List<Book> books = bookRepository.findByNameAndPrice(name, price);
        return new ResponseVo<>(books);
    }
springboot集成elasticsearch7.17,spring boot,elasticsearch,java

6、查詢創(chuàng)建機制關鍵詞

And
關鍵詞 樣本
And findByNameAndPrice

Es 查詢字符串:

"bool" : {
"must" : [
{ "query_string" : { "query" : "?", "fields" : [ "name" ] } },
{ "query_string" : { "query" : "?", "fields" : [ "price" ] } }
]
}
}}
Or
關鍵詞 樣本
Or findByNameOrPrice

Es 查詢字符串:

{ "query" : {
"bool" : {
"should" : [
{ "query_string" : { "query" : "?", "fields" : [ "name" ] } },
{ "query_string" : { "query" : "?", "fields" : [ "price" ] } }
]
}
}}
Is
關鍵詞 樣本
Is findByName

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "?", "fields" : [ "name" ] } }
]
}
}}
Not
關鍵詞 樣本
Not findByNameNot

Es 查詢字符串:

{ "query" : {
  "bool" : {
  "must_not" : [
{ "query_string" : { "query" : "?", "fields" : [ "name" ] } }
]
}
}}
Between
關鍵詞 樣本
Between findByPriceBetween

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"range" : {"price" : {"from" : ?, "to" : ?, "include_lower" : true, "include_upper" : true } } }
]
}
}}
LessThan
關鍵詞 樣本
LessThan findByPriceLessThan

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"range" : {"price" : {"from" : null, "to" : ?, "include_lower" : true, "include_upper" : false } } }
]
}
}}
LessThanEqual
關鍵詞 樣本
LessThanEqual findByPriceLessThanEqual

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"range" : {"price" : {"from" : null, "to" : ?, "include_lower" : true, "include_upper" : true } } }
]
}
}}
GreaterThan
關鍵詞 樣本
GreaterThan findByPriceGreaterThan

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"range" : {"price" : {"from" : ?, "to" : null, "include_lower" : false, "include_upper" : true } } }
]
}
}}
GreaterThanEqual
關鍵詞 樣本
GreaterThanEqual findByPriceGreaterThan

Es查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"range" : {"price" : {"from" : ?, "to" : null, "include_lower" : true, "include_upper" : true } } }
]
}
}}
Before
關鍵詞 樣本
Before findByPriceBefore

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"range" : {"price" : {"from" : null, "to" : ?, "include_lower" : true, "include_upper" : true } } }
]
}
}}
After
關鍵詞 樣本
After findByPriceAfter

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"range" : {"price" : {"from" : ?, "to" : null, "include_lower" : true, "include_upper" : true } } }
]
}
}}
Like
關鍵詞 樣本
Like findByNameLike

Es查詢字符串

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "?*", "fields" : [ "name" ] }, "analyze_wildcard": true }
]
}
}}
StartingWith
關鍵詞 樣本
StartingWith findByNameStartingWith

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "?*", "fields" : [ "name" ] }, "analyze_wildcard": true }
]
}
}}
EndingWith
關鍵詞 樣本
EndingWith findByNameEndingWith

Es查詢字符串

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "*?", "fields" : [ "name" ] }, "analyze_wildcard": true }
]
}
}}
Contanins/Containing
關鍵詞 樣本
Contains/Containing findByNameContaining

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "*?*", "fields" : [ "name" ] }, "analyze_wildcard": true }
]
}
}}
In(當注釋為 FieldType.Keyword 時)
關鍵詞 樣本
In(當注釋為 FieldType.Keyword 時) findByNameIn(Collectionnames)

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"bool" : {"must" : [
{"terms" : {"name" : ["?","?"]}}
]
}
}
]
}
}}
In
關鍵詞 樣本
In findByNameIn(Collectionnames)

Es 查詢字符串:

{ "query": {"bool": {"must": [{"query_string":{"query": "\"?\" \"?\"", "fields": ["name"]}}]}}}
Notln(當注釋為 FieldType.Keyword 時)
關鍵詞 樣本
NotIn(當注釋為 FieldType.Keyword 時) indByNameNotIn(Collectionnames)

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{"bool" : {"must_not" : [
{"terms" : {"name" : ["?","?"]}}
]
}
}
]
}
}}
Notln
關鍵詞 樣本
NotIn findByNameNotIn(Collectionnames)

Es 查詢字符串:

{"query": {"bool": {"must": [{"query_string": {"query": "NOT(\"?\" \"?\")", "fields": ["name"]}}]}}}
關鍵詞 | 樣本
--- | ----
True|findByAvailableTrue

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "true", "fields" : [ "available" ] } }
]
}
}}
False
關鍵詞 樣本
False findByAvailableFalse

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "false", "fields" : [ "available" ] } }
]
}
}}
OrderBy
關鍵詞 樣本
OrderBy findByAvailableTrueOrderByNameDesc

Es 查詢字符串:

{ "query" : {
"bool" : {
"must" : [
{ "query_string" : { "query" : "true", "fields" : [ "available" ] } }
]
}
}, "sort":[{"name":{"order":"desc"}}]
}
Exists
關鍵詞 樣本
Exists findByNameExists

Es 查詢字符串:

{"query":{"bool":{"must":[{"exists":{"field":"name"}}]}}}
IsNull
關鍵詞 樣本
IsNull findByNameIsNull

Es 查詢字符串:

{"query":{"bool":{"must_not":[{"exists":{"field":"name"}}]}}}
IsNotNull
關鍵詞 樣本
IsNotNull findByNameIsNotNull

Es 查詢字符串:

{"query":{"bool":{"must":[{"exists":{"field":"name"}}]}}}
IsEmpty
關鍵詞 樣本
IsEmpty findByNameIsEmpty

Es 查詢字符串:

{"query":{"bool":{"must":[{"bool":{"must":[{"exists":{"field":"name"}}],"must_not":[{"wildcard":{"name":{"wildcard":"*"}}}]}}]}}}
IsNotEmpty
關鍵詞 樣本
IsNotEmpty findByNameIsNotEmpty

Es 查詢字符串:

{"query":{"bool":{"must":[{"wildcard":{"name":{"wildcard":"*"}}}]}}}	

7、高級查詢

注入 ElasticsearchOperations bean

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.MatchAllQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch._types.query_dsl.TermQuery;
import co.elastic.clients.json.JsonData;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zhuang.es.EsApplication;
import com.zhuang.es.entity.Book;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.client.elc.NativeQuery;
import org.springframework.data.elasticsearch.client.elc.NativeQueryBuilder;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHits;

import javax.annotation.Resource;

/**
 * @program: mybatis-plus
 * @description:
 * @author: mrzhuang
 * @create: 2022-12-22 21:43
 **/

@Slf4j
@SpringBootTest(classes = EsApplication.class)
public class EsTest {
    @Resource
    ElasticsearchOperations operations;

    @Test
    public void testSearch() {
        //term查詢
        TermQuery termQuery = new TermQuery.Builder().field("price").value("10.2").build();
        Query tQuery = new Query.Builder().term(termQuery).build();
        //等同于lambda表達式
        Query price2 = new Query.Builder().term(t -> t.field("price").value("10.2")).build();

        BoolQuery boolQuery = new BoolQuery.Builder()
                //filter
                .filter(q -> q.range(r -> r.field("price").gte(JsonData.of(11.0)).lt(JsonData.of(16.0))))
                //matchAll
                .must(q -> q.matchAll(new MatchAllQuery.Builder().build())).build();

        NativeQuery nativeQuery = new NativeQueryBuilder().withQuery(q -> q.bool(boolQuery))
                //查詢結果按照price從小到大排序
                .withSort(Sort.by(Sort.Direction.ASC, "price"))
                //第0頁開始
                .withPageable(PageRequest.of(0, 5))
                .build();
        SearchHits<Book> search = operations.search(nativeQuery, Book.class);
        search.stream().forEach(System.out::println);

    }
}

二、Es客戶端elasticsearchClient

1、創(chuàng)建客戶端配置類 ElasticSearchConfig

package com.zhuang.es.config;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.Node;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;

import javax.annotation.Resource;

@Configuration
@Slf4j
public class ElasticSearchConfig extends ElasticsearchConfigurationSupport {
    @Resource
    private ElasticsearchProperties elasticSearchProperty;
 
    @Bean
    public RestClientBuilder restClientBuilder() {
        return RestClient.builder(elasticSearchProperty.getUris().stream().map(this::getElasticSearchHttpHosts).toArray(HttpHost[]::new)).
                setRequestConfigCallback(requestConfigBuilder -> {
                    //設置連接超時時間
                    requestConfigBuilder.setConnectTimeout(elasticSearchProperty.getConnectionTimeout().toMillisPart());
                    requestConfigBuilder.setSocketTimeout(elasticSearchProperty.getSocketTimeout().toMillisPart());
                    return requestConfigBuilder;
                }).setFailureListener(new RestClient.FailureListener() {
                    //某節(jié)點失敗,這里可以做一些告警
                    @Override
                    public void onFailure(Node node) {
                        log.error("[ ElasticSearchClient ] >>  node :{}, host:{},  fail ", node.getName(), node.getHost());
                    }
                }).setHttpClientConfigCallback(httpClientBuilder -> {
                    // 設置[X-Elastic-Product] header
                    httpClientBuilder.disableAuthCaching().addInterceptorLast((HttpResponseInterceptor)(response, context) -> response.addHeader("X-Elastic-Product", "Elasticsearch"));

                    //設置賬密
                    return getHttpAsyncClientBuilder(httpClientBuilder);
                });
    }
 
 
    /**
     * 配置es client
     */
    @Bean(value = "elasticsearchClient")
    public ElasticsearchClient elasticsearchClient(@Qualifier("restClientBuilder") RestClientBuilder restClientBuilder) {
        RestClient restClient = restClientBuilder.setDefaultHeaders(new Header[]{new BasicHeader("Content-Type", "application/json")}).build();
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }
 
    @Bean(value = "elasticsearchTemplate")
    public ElasticsearchTemplate elasticsearchTemplate(ElasticsearchClient elasticsearchClient, ElasticsearchConverter elasticsearchConverter) {
        return new ElasticsearchTemplate(elasticsearchClient, elasticsearchConverter);
    }
 
    private HttpHost getElasticSearchHttpHosts(String host) {
        host = host.replaceAll("http://", "").replaceAll("https://", "");
        return new HttpHost(host.split(":")[0], Integer.parseInt(host.split(":")[1]), "http");
    }
 
 
    private HttpAsyncClientBuilder getHttpAsyncClientBuilder(HttpAsyncClientBuilder httpClientBuilder) {
        if (StringUtils.isEmpty(elasticSearchProperty.getUsername()) || StringUtils.isEmpty(elasticSearchProperty.getPassword())) {
            return httpClientBuilder;
        }
        //設置賬號密碼
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(elasticSearchProperty.getUsername(), elasticSearchProperty.getPassword()));
        httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
        return httpClientBuilder;
    }
}

2、增刪改查、批量操作

注入ElasticsearchClient bean文章來源地址http://www.zghlxwxcb.cn/news/detail-823394.html

   @Resource(name = "elasticsearchClient")
   ElasticsearchClient client;
package com.zhuang;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.core.bulk.IndexOperation;
import co.elastic.clients.elasticsearch.core.bulk.UpdateOperation;
import co.elastic.clients.elasticsearch.indices.CreateIndexRequest;
import co.elastic.clients.elasticsearch.indices.CreateIndexResponse;
import com.zhuang.es.EsApplication;
import com.zhuang.es.entity.Book;
import com.zhuang.es.service.BookRepository;
import com.zhuang.es.vo.BookVo;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;

/**
 * @program: kafka
 * @description:
 * @author: mrzhuang
 * @create: 2022-12-25 13:04
 **/
@Slf4j
@SpringBootTest(classes = EsApplication.class)
public class EsClientTest {

    @Resource
    BookRepository repository;
    @Resource(name = "elasticsearchClient")
    ElasticsearchClient client;

    /**
     * 創(chuàng)建索引
     * @throws IOException
     */
    @Test
    void testCreateIndex() throws IOException {
        //client.indices().create(c->c.index("book"));
        CreateIndexRequest createIndexRequest= new CreateIndexRequest.Builder().index("book").build();
        CreateIndexResponse indexResponse = client.indices().create(createIndexRequest);
        log.info("[{}]索引創(chuàng)建[{}]!", indexResponse.index(), indexResponse.shardsAcknowledged());
    }

    /**
     * 增加數(shù)據(jù)
     * @throws IOException
     */
    @Test
    void testInsertData() throws IOException {
        Optional<Book> book = repository.findById(1l);
        IndexRequest<Book> indexRequest = new IndexRequest.Builder<Book>().index("book").id("1").document(book.isPresent() ? book.get() : Book.builder().name("小劉").id(2l).build()).build();
        //IndexRequest source = indexRequest.index("book").id("1").source(book.isPresent() ? book.get() : Book.builder().name("小劉"));
        IndexResponse index = client.index(indexRequest);
        log.info("向索引[{}]中增加id:[{}]文檔:[{}]", index.index(), index.id(), index.result());
    }
    /**
     * 刪除數(shù)據(jù)
     * @throws IOException /
     */
    @Test
    void testDeleteData() throws IOException {
        //1.根據(jù)id刪除
        DeleteRequest deleteRequest = new DeleteRequest.Builder().index("book").id("gAcXSIUB94FMQr43ryS6").build();
        DeleteResponse deleteResponse = client.delete(deleteRequest);
        log.info("根據(jù)id刪除:{}", deleteResponse.result().jsonValue());


        //2.根據(jù)查詢條件刪除
        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest.Builder().index(List.of("book")).query(q -> q.term(t -> t.field("name").value("xiaoxiao"))).build();
        DeleteByQueryResponse deleteByQueryResponse = client.deleteByQuery(deleteByQueryRequest);
        log.info("根據(jù)查詢條件刪除:{}個", deleteByQueryResponse.total());
    }

    /**
     * 更新數(shù)據(jù)
     *
     * @throws IOException
     */
    @Test
    void testUpdateDate() throws IOException {
        //方法1:創(chuàng)建實體類BookVo對應的實體類的屬性和名稱與Book相同
        //會將Book中對應的屬性值替換為需要修改的bookVo中的屬性值,然后更新es相對應的屬性值
        BookVo bookVo = BookVo.builder().parent("媽").build();
        UpdateRequest<Book, BookVo> update1 = new UpdateRequest.Builder<Book, BookVo>().index("book").id("1").doc(bookVo).build();

        //方法2:創(chuàng)建Map
        Map<String, String > map = new HashMap<>();
        map.put("parent","爸媽");
        UpdateRequest<Book, Map<String, String >> update2 = new UpdateRequest.Builder<Book, Map<String, String >>().index("book").id("1").doc(map).build();

        UpdateResponse<Book> update = client.update(update1, Book.class);
        log.info("update:{}", update.result());
    }
    /**
     * 查詢數(shù)據(jù)
     * @throws IOException
     */
    @Test
    void testSearch() throws IOException {
        TermQuery termQuery = new TermQuery.Builder().field("id").value("11").build();
        Query query = new Query.Builder().term(termQuery).build();
        BoolQuery boolQuery = new BoolQuery.Builder().must(query).build();
        Query build = new Query.Builder().bool(boolQuery).build();
        SearchRequest searchRequest = new SearchRequest.Builder().query(build).index(Arrays.asList(new String[]{"book"})).build();

        SearchResponse<Book> response = client.search(searchRequest, Book.class);
        log.info("查詢數(shù)據(jù):{}", response.hits().hits().size());
    }

    /**
     * 批量增加
     * @throws IOException
     */
    @Test
    void testBulkInsert() throws IOException {
        //批量新增數(shù)據(jù)
        //第一個數(shù)據(jù)
        IndexOperation<Book> indexOperation1 = new IndexOperation.Builder<Book>().id("2").document(Book.builder().id(2l).name("小莊呀").build()).build();
        BulkOperation operation1 = new BulkOperation.Builder().index(indexOperation1).build();
        //第二個數(shù)據(jù)
        IndexOperation<Book> indexOperation2 = new IndexOperation.Builder<Book>().id("3").document(Book.builder().id(3l).name("小莊呀").build()).build();
        BulkOperation operation2 = new BulkOperation.Builder().index(indexOperation1).build();

        List<BulkOperation> operations = new ArrayList<>();
        operations.add(operation1);
        operations.add(operation2);

        BulkRequest bulkRequest = new BulkRequest.Builder().index("book").operations(operations).build();
        BulkResponse bulkResponse = client.bulk(bulkRequest);
        log.info("批量刪除:{}, size:{}", !bulkResponse.errors(), bulkResponse.items().size());
    }

    /**
     * 批量更新
     * @throws IOException
     */
    @Test
    void testBulkUpdate() throws IOException {
        //批量新增數(shù)據(jù)
        //第一個數(shù)據(jù)
        UpdateOperation<Book, BookVo> updateOperation1 = new UpdateOperation.Builder<Book, BookVo>().id("2").action(b -> b.doc(BookVo.builder().name("xiaoxiao").build())).build();
        BulkOperation operation1 = new BulkOperation.Builder().update(updateOperation1).build();

        //第一個數(shù)據(jù)
        UpdateOperation<Book, BookVo> updateOperation2 = new UpdateOperation.Builder<Book, BookVo>().id("3").action(b -> b.doc(BookVo.builder().name("xiao").build())).build();
        BulkOperation operation2= new BulkOperation.Builder().update(updateOperation2).build();

        List<BulkOperation> operations = new ArrayList<>();
        operations.add(operation1);
        operations.add(operation2);

        BulkRequest bulkRequest = new BulkRequest.Builder().index("book").operations(operations).build();
        BulkResponse bulkResponse = client.bulk(bulkRequest);
        log.info("批量更新:{}, size:{}", !bulkResponse.errors(), bulkResponse.items().size());
    }
}

到了這里,關于springboot集成elasticsearch7.17.3的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • SpringBoot集成Elasticsearch7.4 實戰(zhàn)(一)

    SpringBoot集成Elasticsearch7.4 實戰(zhàn)(一)

    在網(wǎng)上已經(jīng)有好多關于Elasticsearch的介紹,就不在翻來覆去講一些基本概念,大家感興趣的可以自己去找一些資料鞏固下。這次只為了顧及眾多首次接觸Elasticsearch,案例都講的很淺顯,還有就是受個人能力所限,各位讀者發(fā)現(xiàn)有錯誤之處,也可進行討論和指出。 本篇文章主要

    2023年04月09日
    瀏覽(28)
  • SpringBoot集成Elasticsearch7.x(3)|(aggregations之指標聚合查詢)

    章節(jié) 第一章鏈接: SpringBoot集成Elasticsearch7.x(1)|(增刪改查功能實現(xiàn)) 第二章鏈接: SpringBoot集成Elasticsearch7.x(2)|(復雜查詢) 第三章鏈接: SpringBoot集成Elasticsearch7.x(3)|(aggregations之指標聚合查詢) 第四章鏈接: SpringBoot集成Elasticsearch7.x(4)|(aggregations之分桶聚合查詢)

    2024年02月05日
    瀏覽(22)
  • ElasticSearch 學習9 spring-boot ,elasticsearch7.16.1實現(xiàn)中文拼音分詞搜索

    ElasticSearch 學習9 spring-boot ,elasticsearch7.16.1實現(xiàn)中文拼音分詞搜索

    一、elasticsearch官網(wǎng)下載:Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁簡體轉換插件安裝 ik分詞:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary. 拼音分詞:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is

    2024年01月22日
    瀏覽(27)
  • springboot集成Elasticsearch7.16,使用https方式連接并忽略SSL證書

    千萬萬苦利用科學上網(wǎng)找到了,記錄一下

    2024年02月09日
    瀏覽(25)
  • Elasticsearch7.x——spring-boot-starter-data-elasticsearch詳解

    Elasticsearch7.x——spring-boot-starter-data-elasticsearch詳解

    Spring Data Elasticsearch是Spring Data項目下的一個子模塊。 查看 Spring Data的官網(wǎng):http://projects.spring.io/spring-data/ Spring Data 的使命是給各種數(shù)據(jù)訪問提供統(tǒng)一的編程接口,不管是關系型數(shù)據(jù)庫(如MySQL),還是非關系數(shù)據(jù)庫(如Redis),或者類似Elasticsearch這樣的索引數(shù)據(jù)庫。從而簡化

    2024年02月03日
    瀏覽(19)
  • Spring Boot 集成 ElasticSearch

    Spring Boot 集成 ElasticSearch

    首先創(chuàng)建一個項目,在項目中加入 ES 相關依賴,具體依賴如下所示: 在配置文件 application.properties 中配置 ES 的相關參數(shù),具體內(nèi)容如下: 其中指定了 ES 的 host 和端口以及超時時間的設置,另外我們的 ES 沒有添加任何的安全認證,因此 username 和 password 就沒有設置。 然后在

    2024年02月03日
    瀏覽(24)
  • Spring boot簡單集成Elasticsearch

    本文主要介紹Spring boot如何簡單集成Elasticsearch,關于es,可以理解為一個數(shù)據(jù)庫,往es中插入數(shù)據(jù),然后使用es進行檢索。 環(huán)境準備 安裝es 和kibana :參考 安裝ik分詞器:參考 相關配置 pom.xml文件中引入es: yml文件配置es: ES查詢 往es插數(shù)據(jù) 需要讓mapper層繼承ElasticsearchReposito

    2024年02月22日
    瀏覽(91)
  • Spring Boot集成Elasticsearch實戰(zhàn)

    Spring Boot集成Elasticsearch實戰(zhàn)

    最近項目中要使用Elasticsearch所以就去簡單的學習了一下怎么使用,具體的一些在高級的功能暫時展示不了,能力目前有點限,不過一些基本的需求還是可以滿足的。所以就寫了一篇整理一下也希望能夠指出不足之處 docker部署 正常部署 首先根據(jù)spring提供的findAll方法獲取所有

    2024年02月09日
    瀏覽(24)
  • Spring Boot 集成 Elasticsearch 實戰(zhàn)

    Spring Boot 集成 Elasticsearch 實戰(zhàn)

    @Configuration public class ElasticsearchConfiguration { @Value(“${elasticsearch.host}”) private String host; @Value(“${elasticsearch.port}”) private int port; @Value(“${elasticsearch.connTimeout}”) private int connTimeout; @Value(“${elasticsearch.socketTimeout}”) private int socketTimeout; @Value(“${elasticsearch.connectionRequestTimeout}”

    2024年04月10日
    瀏覽(32)
  • Linux環(huán)境安裝配置Elasticsearch7.17

    Linux環(huán)境安裝配置Elasticsearch7.17

    服務器環(huán)境為CentOS7.6,Elasticsearch版本為7.17.4 2.1 下載 選擇要安裝的版本:下載地址 解壓到指定目錄 重命名為es 2.2 創(chuàng)建ES用戶 Elasticsearch不允許用root身份啟動,所以要新建一個用戶并授予權限 2.3 修改ES配置文件 修改ES的核心配置文件 在文件末尾添加以下幾行 修改內(nèi)存參數(shù)配

    2024年02月06日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包