contente
4. Descubra a interpretação dos dados
2. O SpringBoot integra o Elasticseach
3. Crie uma classe pojo correspondente ao índice
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));
}
}