SpringBoot integra o Elasticseach

contente

1. Introdução ao Elasticseach

1. Breve introdução

2. Relação comparativa:

3. Descrição detalhada:

4. Descubra a interpretação dos dados

 2. O SpringBoot integra o Elasticseach

1. Introduzir dependências

2. Adicionar configuração

3. Crie uma classe pojo correspondente ao índice

4. SpringData encapsula adições, exclusões e alterações básicas e personaliza adições, exclusões e alterações.

5. Método de teste - adição, exclusão, modificação e inspeção

Se este blog for útil para você, lembre-se de deixar uma mensagem + like + favorito. 


1. Introdução ao Elasticseach

1. Breve introdução

Site oficial: Open Source Search: Desenvolvedor do Elasticsearch, ELK Stack e Kibana | Elastic https://www.elastic.co/cn/

Tutorial de instalação detalhado do ElasticSeach -- a introdução gráfica e de texto é super detalhada: Tutorial de instalação detalhado do ElasticSeach -- a introdução gráfica e de texto é super detalhada O Elasticsearch é um mecanismo distribuído de pesquisa e análise de dados no estilo RESTful que aborda uma ampla variedade de casos de uso emergentes. No coração do Elastic Stack, ele armazena seus dados de forma centralizada, ajudando você a descobrir o inesperado e o inesperado. O Elasticsearch é um mecanismo de pesquisa e análise distribuído baseado em JSON. https://blog.csdn.net/promsing/article/details/122722302

Slogan memorável: ser capaz de identificar o esperado e o inesperado

O Elasticsearch também é uma biblioteca de recuperação de texto completo baseada no Lucene, e sua essência é armazenar dados. Muitos conceitos são semelhantes ao MySQL. É uma tecnologia de recuperação de texto completo.

O Elasticsearch é um mecanismo distribuído de pesquisa e análise no coração do Elastic Stack. O Logstash e o Beats ajudam a coletar, agregar e enriquecer seus dados e armazená-los no Elasticsearch. O Kibana permite que você explore, visualize e compartilhe interativamente informações sobre seus dados e gerencie e monitore pilhas. O Elasticsearch é onde a mágica da indexação, pesquisa e análise acontece.

O Elasticsearch é um mecanismo de pesquisa e análise distribuído baseado em JSON.

Desenvolvido na linguagem Java e lançado como código aberto sob os termos da Licença Apache, o Elasticsearch é um mecanismo de pesquisa de nível empresarial popular. O Elasticsearch é usado na computação em nuvem para obter pesquisa em tempo real, estável, confiável, rápida e fácil de instalar e usar.

2. Relação comparativa:

索引(indices)--------------------------------Databases 数据库

  类型(type)-----------------------------Table 数据表

     文档(Document)----------------Row 行

	   字段(Field)-------------------Columns 列

3. Descrição detalhada:

conceito

ilustrar

Biblioteca de índices (índices)

índices é o plural de índice, representando muitos índices,

tipo

O tipo é para simular o conceito de tabela no mysql. Pode haver diferentes tipos de índices em um banco de dados de índice, como índice de mercadorias e índice de pedidos, e seus formatos de dados são diferentes. No entanto, isso causará confusão na biblioteca de índices, portanto, esse conceito será removido em uma versão futura

documento

Armazene os dados originais na biblioteca de índice. Por exemplo, cada informação de produto é um documento

campo

propriedades no documento

Configuração de mapeamento (mapeamentos)

Tipo de dados do campo, atributos, se deve ser indexado, se deve ser armazenado e outras características

4. Descubra a interpretação dos dados

 levou: o tempo gasto pela consulta     em  milissegundos
 time_out: tenha expirado
 ou    não    , cada elemento é uma parte das informações do documento pesquisado       _index: biblioteca de índice      _type: tipo de documento      _id: id do documento      _score: pontuação do documento      _source: dados de origem de o documento









 2. O SpringBoot integra o Elasticseach

1. Introduzir dependências

<dependencies>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
 </dependencies>

2. Adicionar configuração

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: 192.168.7.132:9300

3. Crie uma classe pojo correspondente ao índice

package com.leyou.elasticsearch.pojo;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * 创建pojo类与索引对应
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/1/26 - 20:35
 */
@Document(indexName = "item", type = "docs", shards = 1, replicas = 0)
public class Item {
    @Id
    private  Long id;


    /**
     * 标题
     */
    @Field(type = FieldType.Text,analyzer = "ik_max_word")
    private String title;

    /**
     * 分类
     */
    @Field(type = FieldType.Keyword)
    private  String category;

    /**
     * 品牌
     */
    @Field(type = FieldType.Keyword)
    private  String brand;

    /**
     * 价格
     */
    @Field(type = FieldType.Double)
    private  Double price;

    /**
     * 图片地址
     */
    @Field(type = FieldType.Keyword)
    private  String images;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getImages() {
        return images;
    }

    public void setImages(String images) {
        this.images = images;
    }

    public Item() {
    }

    public Item(Long id, String title, String category, String brand, Double price, String images) {
        this.id = id;
        this.title = title;
        this.category = category;
        this.brand = brand;
        this.price = price;
        this.images = images;
    }

    @Override
    public String toString() {
        return "Item{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", category='" + category + '\'' +
                ", brand='" + brand + '\'' +
                ", price=" + price +
                ", images='" + images + '\'' +
                '}';
    }
}

4. SpringData encapsula adições, exclusões e alterações básicas e personaliza adições, exclusões e alterações.

Aqui você precisa herdar a interface -ItemRepository 

/**
 * 自定义的增删改查接口
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/1/27 - 15:10
 */
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {

    List<Item> findByTitle(String title);

    List<Item> findByPriceBetween(Double d1,Double d2);
}

5. Método de teste - adição, exclusão, modificação e inspeção

package com.leyou.elasticsearch;

import com.leyou.elasticsearch.dao.ItemRepository;
import com.leyou.elasticsearch.pojo.Item;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 测试ES的增删改查
 *
 * @author Promsing(张有博)
 * @version 1.0.0
 * @since 2022/1/26 - 20:57
 */
@SpringBootTest(classes = ElasticsearchApplication.class)
@RunWith(SpringRunner.class)
public class ElasticsearchTest {

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;//ES的模板类

    @Autowired
    private ItemRepository itemRepository;//Item的增删改查



    /**
     * 创建索引库
     */
    @Test
    public void testIndex(){

        this.elasticsearchTemplate.createIndex(Item.class);
        this.elasticsearchTemplate.putMapping(Item.class);
        //this.elasticsearchTemplate.deleteIndex();


    }

    /**
     * 插入与更新
     */
    @Test
    public void testCreate(){

        Item item = new Item(1L,"小米手机9","手机","小米",3999.00,"https:www.baidu.com");
        Object save = this.itemRepository.save(item);

        List<Item> list = new ArrayList<>();
        list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.leyou.com/123.jpg"));
        list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.leyou.com/3.jpg"));
        // 接收对象集合,实现批量新增
        Iterable<Item> items = itemRepository.saveAll(list);
        System.out.println(items);


    }

    /**
     * 删除
     */
    @Test
    public void testDelete(){

        Item item=new Item(1L,"小米手机9","手机","小米",3999.00,"https:www.baidu.com");
        this.itemRepository.delete(item);

    }


    /**
     * 查询
     */
    @Test
    public void testFind(){
        System.out.println("-----主键查询------");
        Optional<Item> byId = this.itemRepository.findById(1L);
        System.out.println(byId.get());

        System.out.println("-----查询全部------");

        Iterable<Item> all = this.itemRepository.findAll();
        all.forEach(i-> System.out.println(i));

        System.out.println("-----排序查询(升序降序)------");
        Iterable<Item> price = this.itemRepository.findAll(Sort.by("price").descending());
        price.forEach(System.out::println);
    }

    /**
     * 调用自定义方法
     */
    @Test
    public void testFindByU(){
        List<Item> phone = this.itemRepository.findByTitle("手机");
//        phone.forEach(i->{
//            System.out.println(i);
//        });

        List<Item> byPriceBetween = this.itemRepository.findByPriceBetween(4000.0, 5000.0);
        byPriceBetween.forEach(i-> System.out.println(i));
    }

    /**
     * 批量插入
     */
    @Test
    public void indexList() {
        List<Item> list = new ArrayList<>();
        list.add(new Item(1L, "小米手机7", "手机", "小米", 3299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(2L, "坚果手机R1", "手机", "锤子", 3699.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(3L, "华为META10", "手机", "华为", 4499.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(4L, "小米Mix2S", "手机", "小米", 4299.00, "http://image.leyou.com/13123.jpg"));
        list.add(new Item(5L, "荣耀V10", "手机", "华为", 2799.00, "http://image.leyou.com/13123.jpg"));
        // 接收对象集合,实现批量新增
        itemRepository.saveAll(list);
    }

    /**
     * 高级查询
     */
    @Test
    public void testSearch(){

        //通过查询构建器工具构建--重点:QueryBuilders:词条、模糊、范围
        MatchQueryBuilder queryBuilder= QueryBuilders.matchQuery("title","手机");
        //获取结果集
        Iterable<Item> items = this.itemRepository.search(queryBuilder);

        items.forEach(System.out::println);

    }

    /**
     * 重点--自定义查询
     */
    @Test
    public void testNative(){
        // 构建自定义查询构建器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本查询条件
        queryBuilder.withQuery(QueryBuilders.matchQuery("title","手机"));
        // 查询分页结果集
        Page<Item> itemPage = this.itemRepository.search(queryBuilder.build());
        System.out.println(itemPage.getTotalPages());
        System.out.println(itemPage.getTotalElements());
        itemPage.forEach(i-> System.out.println(i));

    }

    /**
     * 重点--分页查询
     */
    @Test
    public void testPage(){
        // 构建自定义查询构建器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本查询条件
        queryBuilder.withQuery(QueryBuilders.matchQuery("category","手机"));
        queryBuilder.withPageable(PageRequest.of(1,2));
        // 查询分页结果集
        Page<Item> itemPage = this.itemRepository.search(queryBuilder.build());
        System.out.println(itemPage.getTotalPages());
        System.out.println(itemPage.getTotalElements());
        itemPage.forEach(i-> System.out.println(i));

    }

    /**
     * 重点--排序
     */
    @Test
    public void testSort(){
        // 构建自定义查询构建器
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
        // 添加基本查询条件
        queryBuilder.withQuery(QueryBuilders.matchQuery("category","手机"));
        queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.DESC));
        // 查询分页结果集
        Page<Item> itemPage = this.itemRepository.search(queryBuilder.build());
        System.out.println(itemPage.getTotalPages());
        System.out.println(itemPage.getTotalElements());
        itemPage.forEach(i-> System.out.println(i));

    }
}

Se este blog for útil para você, lembre-se de deixar uma mensagem + like + favorito . 

Acho que você gosta

Origin blog.csdn.net/promsing/article/details/122876032
Recomendado
Clasificación