介绍

Elasticsearch 是一个实时分布式搜索和分析引擎,一般用于全文搜索、结构化搜索,分析或者三者混用。
它的底层是基于Apache Lucene(TM)的开源搜索引擎,但是lucene只是一个库,需要java开发然后集成到应用。

基础概念


应用场景


ES安装

修改config/elasticsearch.yml

  • windows安装

  • 启动

# 后台启动
./bin/elasticsearch -d

安装Head插件

https://github.com/mobz/elasticsearch-head
下载解压。

npm run start

集群配置

  • 主节点
  • 新建slave1, slave2 两个es

增删改查

https://www.bbsmax.com/A/kmzL44gGzG/
https://blog.csdn.net/weixin_47600880/article/details/119034733

  • 创建索引
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
}

参数说明:
number_of_shards:索引分片数量
number_of_replicas:索引备份数量
mappings:索引结构化格式映射关键字
properties:设置索引的属性

  • 插入文档
    http://localhost:9200/people/_doc/1/

  • 更新文档
    http://localhost:9200/people/_update/1

  • 查询文档
    http://localhost:9200/people/_doc/1

http://localhost:9200/people/_search

{
"query": {
"match_all": {}
}
}
  • 条件查询
    http://localhost:9200/people/_search
{
"query": {
"match": {
"name": "治"
}
},
"from": 1,
"size": 1,
"sort": [
{
"_id": {
"order": "asc"
}
  • 聚合查询
    http://localhost:9200/people/_search
{
"aggs": {
"group_by_id": {
"terms": {
"field": "_id"
}
}
}
}

高级查询


  • 习语查询
  • 多字段查询
  • query_string
  • 范围查询



Springboot集成es实战

依赖:SpringBoot 2.3.7.RELEASE + ElasticSearch 8.1.1

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.test.java</groupId>
<artifactId>springboot_es_house</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <dependencies>
<!--Spring Boot Web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!--<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>--> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.44</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency> <dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.1.1</version>
</dependency> <dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.0.1</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

esclient配置类

package com.test.java.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 org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* @Author laoxu
* @Date 2023/2/17 15:06
* @Desc 配置ES客户端
*/
@Configuration
public class ESConfig {
@Bean
public ElasticsearchClient elasticsearchClient(){
RestClient client = RestClient.builder(new HttpHost("localhost", 9200,"http")).build();
ElasticsearchTransport transport = new RestClientTransport(client,new JacksonJsonpMapper()); return new ElasticsearchClient(transport);
}
}

product实体类

package com.test.java.entity;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; import java.math.BigDecimal; /**
* @Author laoxu
* @Date 2023/2/17 15:26
* @Desc 商品实体类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product {
private String productName;
private double price;
private Integer stock; public String geIndexId() {
int id = 1;
id += id;
String indexId = String.valueOf(id);
return indexId;
}
}

Junit测试类

package com.test.java;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.query_dsl.MatchQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.Query;
import co.elastic.clients.elasticsearch._types.query_dsl.RangeQuery;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkResponseItem;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.core.search.TotalHits;
import co.elastic.clients.elasticsearch.core.search.TotalHitsRelation;
import co.elastic.clients.elasticsearch.indices.*;
import co.elastic.clients.elasticsearch.indices.ExistsRequest;
import co.elastic.clients.json.JsonData;
import co.elastic.clients.transport.endpoints.BooleanResponse;
import com.test.java.entity.Product;
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.test.context.junit4.SpringRunner; import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; /**
* @Author laoxu
* @Date 2023/2/17 15:28
* @Desc 测试ES增删改查API
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ESApiTest {
@Autowired
private ElasticsearchClient esClient; /**
* 判断索引是否存在
* @throws IOException
*/
@Test
public void existsIndex() throws IOException {
ExistsRequest existsRequest = new ExistsRequest.Builder().index("product").build();
BooleanResponse existsResponse = esClient.indices().exists(existsRequest);
System.out.println("是否存在:"+existsResponse.value());
}
/**
* 创建索引
* 创建索引时,必须是小写,否则创建报错
* @throws IOException
*/
@Test
public void createIndex() throws IOException {
CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index("product").build();
CreateIndexResponse createIndexResponse = esClient.indices().create(createIndexRequest);
System.out.println("是否成功:"+createIndexResponse.acknowledged());
} /**
* 删除索引
* @throws IOException
*/
@Test
public void deleteIndex() throws IOException {
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest.Builder().index("product").build();
DeleteIndexResponse deleteIndexResponse = esClient.indices().delete(deleteIndexRequest);
System.out.println("是否成功:"+deleteIndexResponse.acknowledged());
} /**
* 同步方式
* 向索引中添加信息,此操作不存在索引时会直接创建索引,使用时需要各种校验使逻辑更严谨
* @throws IOException
*/
@Test
public void setIndex() throws IOException {
Product product = new Product("帽子",44.5,9);
IndexRequest<Product> indexRequest = new IndexRequest.Builder<Product>().index("product")
.id(String.valueOf(product.getStock()))
.document(product)
.build();
IndexResponse indexResponse = esClient.index(indexRequest);
System.out.println(indexResponse);
} /**
* 批量写入数据
* @throws IOException
*/
@Test
public void bulkIndex() throws IOException{
List<Product> products = new ArrayList<Product>();
products.add(new Product("香烟",135,1));
products.add(new Product("瓜子",154,2));
products.add(new Product("矿泉水",613,3));
products.add(new Product("酱油",72,4));
products.add(new Product("大米",771,5));
BulkRequest.Builder bk = new BulkRequest.Builder();
int indexId = 4;
for (Product product:products) {
bk.operations(op->op.index(i->i.index("product")
.id(UUID.randomUUID().toString())
.document(product)));
}
BulkResponse response = esClient.bulk(bk.build());
if (response.errors()) {
System.out.println("Bulk had errors");
for (BulkResponseItem item: response.items()) {
if (item.error() != null) {
System.out.println(item.error().reason());
}
}
}
} /**
* 根据索引文档id获取文档信息
* @throws IOException
*/
@Test
public void getIndexById() throws IOException {
GetRequest getRequest = new GetRequest.Builder().index("product")
.id("9")
.build();
GetResponse<Product> response = esClient.get(getRequest, Product.class);
if (response.found()) {
Product product = response.source();
System.out.println("Product name " + product.getProductName());
System.out.println("Product price " + product.getPrice());
} else {
System.out.println("Product not found");
}
} /**
* 简单查询文档信息
* @throws IOException
*/
@Test
public void getSearch() throws IOException{
/*此处 .from(1).size(2) 表示分页查询,从第一页开始查询,大小为两条*/
SearchRequest searchRequest = new SearchRequest.Builder().index("product")
.query(q -> q.match(m -> m.field("productName").query("烟"))).from(1).size(2).build(); SearchResponse<Product> response = esClient.search(searchRequest,Product.class); TotalHits total = response.hits().total();
boolean isExactResult = total.relation() == TotalHitsRelation.Eq; if (isExactResult) {
System.out.println("There are " + total.value() + " results");
} else {
System.out.println("There are more than " + total.value() + " results");
} List<Hit<Product>> hits = response.hits().hits();
for (Hit<Product> hit: hits) {
Product product = hit.source();
System.out.println("Found product " + product.getProductName() + ", score " + hit.score());
}
} /**
* 多条件嵌套查询文档信息
* @throws IOException
*/
@Test
public void getSearchs() throws IOException{
String productName = "衣服";
double price = 115; //按照产品名称搜索
Query byname = MatchQuery.of(m -> m.field("productName")
.query(productName))._toQuery(); //按照产品价格搜索
Query byprice = RangeQuery.of(r -> r
.field("price")
.gte(JsonData.of(price))
)._toQuery(); //结合名称和价格查询
SearchResponse<Product> response = esClient.search(s -> s
.index("product")
.query(q -> q
.bool(b -> b
.must(byname)
.must(byprice)
)
)
.from(1)
.size(2),
Product.class
); List<Hit<Product>> hits = response.hits().hits();
for (Hit<Product> hit : hits){
Product product = hit.source();
System.out.println(product.getProductName()+" "+product.getPrice());
}
} }

效果展示

ElasticSearch入门安装与SpringBoot集成实战的更多相关文章

  1. RabbitMQ学习笔记(一):安装及Springboot集成

    前言 MQ,即消息队列Message Queue的缩写. RabbitMQ 是MQ的一种,就像招商银行是银行的一种一样.主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息 ...

  2. ElasticSearch基础学习(SpringBoot集成ES)

    一.概述 什么是ElasticSearch? ElasticSearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎. 它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服 ...

  3. ELK入门使用-与springboot集成

    前言 ELK官方的中文文档写的已经挺好了,为啥还要记录本文?因为我发现,我如果不写下来,过几天就忘记了,而再次捡起来必然还要经历资料查找筛选测试的过程.虽然这个过程很有意义,但并不总是有那么多时间去做 ...

  4. ElasticSearch入门3: Spring Boot集成ElasticSearch

    第一步:创建项目elasticsearch 编写pom文件 <?xml version="1.0" encoding="UTF-8"?> <p ...

  5. Elasticsearch 入门 - 安装、启动和配置

    安装 请参阅elastic官网 :Installing Elasticsearch 启动 使用 ./bin/elasticsearch 命令即可启动 使用 ./bin/elasticsearch -d ...

  6. ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】

    可以先看下列文章 目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文 ...

  7. SpringBoot | 集成Redis

    Windows下安装: https://github.com/MicrosoftArchive/redis/releases zip下就解包到自定义目录下,msi就跟着步骤安装 进入安装目录下运行命令 ...

  8. springboot集成elasticsearch

    在基础阶段学习ES一般是首先是 安装ES后借助 Kibana 来进行CURD 了解ES的使用: 在进阶阶段可以需要学习ES的底层原理,如何通过Version来实现乐观锁保证ES不出问题等核心原理: 第 ...

  9. springboot整合elasticsearch入门例子

    springboot整合elasticsearch入门例子 https://blog.csdn.net/tianyaleixiaowu/article/details/72833940 Elastic ...

  10. springboot集成elk 一: springboot + Elasticsearch

    1.ELK介绍 1> Elasticsearch是实时全文搜索和分析引擎, 提供搜集.分析.存储数据三大功能: 是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统. ...

随机推荐

  1. java - classpath 的配置

    classpath C:\Program Files\Java\jdk\jre\lib\rt.jar

  2. JS - 递归实现无限分类

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. [转帖]美国出口管制法律制度及中国企业风险防范——EAR核心内容解读

    http://bzy.scjg.jl.gov.cn/wto/zszc/myxgzs/202202/t20220221_636006.html 发布时间:2022-01-18 一.<美国出口管理条 ...

  4. [转帖]Web性能优化工具WebPageTest(一)——总览与配置

    https://www.cnblogs.com/strick/p/6677836.html 网站性能优化工具大致分为两类:综合类和RUM类(实时监控用户类),WebPageTest属于综合类. Web ...

  5. [转帖]Python基础之文件处理(二)

    https://www.jianshu.com/p/7dd08066f499 Python基础文件处理 python系列文档都是基于python3 一.字符编码 在python2默认编码是ASCII, ...

  6. rfc7230 Message Syntax and Routing

    rfc7230 目录 rfc7230 2 Architecture 2.6 Protocol Versioning 3 Message Format 3.1 Start Line 3.1.1 Requ ...

  7. 【JS 逆向百例】如何跟栈调试?某 e 网通 AES 加密分析

    关注微信公众号:K哥爬虫,QQ交流群:808574309,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途 ...

  8. Protobuf示例:Golang and Python

    之前的文章中已经展示过如何在C++中使用protobuf,本文将简单示范protobuf在Golang和Python中的使用. Talk is cheap. Show you my code. 首先是 ...

  9. 基于新浪微博海量用户行为数据、博文数据数据分析:包括综合指数、移动指数、PC指数三个指数

    基于新浪微博海量用户行为数据.博文数据数据分析:包括综合指数.移动指数.PC指数三个指数 项目介绍 微指数是基于海量用户行为数据.博文数据,采用科学计算方法统计得出的反映不同事件领域发展状况的指数产品 ...

  10. 5.4 Windows驱动开发:内核通过PEB取进程参数

    PEB结构(Process Envirorment Block Structure)其中文名是进程环境块信息,进程环境块内部包含了进程运行的详细参数信息,每一个进程在运行后都会存在一个特有的PEB结构 ...