【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch

本文主要是介绍【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


持续学习&持续更新中…

守破离


【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch

  • 简介
  • 基本概念
  • ElasticSearch概念-倒排索引
  • 安装
  • 基本命令
  • ik 分词器
  • SpringBoot整合
    • 测试存储数据:
    • 测试复杂检索
    • 同步与异步调用
  • 参考

在这里插入图片描述

简介

Elasticsearch 是一个高度可扩展且开源的全文检索和分析引擎。它可以让您快速且近实时地存储,检索以及分析海量数据。它通常用作那些具有复杂搜索功能和需求的应用的底层引擎或者技术。(我们得把MySQL中的数据给ES也存储一份,这样ES才能检索这些数据)

  • https://www.elastic.co/cn/what-is/elasticsearch
  • 全文搜索属于最常见的需求,开源的 Elasticsearch 是目前全文搜索引擎的首选。
  • 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它
  • Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。
  • Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
  • REST API:天然的跨平台。
  • 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
  • 官方中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
  • 社区中文:
    • https://es.xiaoleilu.com/index.html
    • http://doc.codingdict.com/elasticsearch/0/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基本概念

在这里插入图片描述

类比MySQL数据库:索引               =============           数据库
类型               =============           数据表
文档               =============           行记录(数据)
属性               =============           列名

一个 Elasticsearch 可以 包含多个 索引 ,相应的每个索引可以包含多个 类型 。 这些不同的类型存储着多个 文档 ,每个文档又有 多个 属性 。【这些文档都是json】

在这里插入图片描述

在这里插入图片描述

ElasticSearch概念-倒排索引

在这里插入图片描述

比如检索“红海特工行动”,会发现,4号记录命中了一次,1/2/3/5分别命中了两次,但是,5号记录是四个单词命中了两次,3号记录是三个单词命中了两次,那么3号记录的相关性得分就更高;查询出的结果会按照相关性得分从高到低排序。

安装

老师安装在虚拟机中,由于内存原因,我安装在Windows下

elasticsearch:7.4.2

https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.4.2-windows-x86_64.zip

elasticsearch.yml:

path.data: G:\elasticsearch\data
path.logs: G:\elasticsearch\logs
http.cors.enabled: true 
http.cors.allow-origin: "*"

jvm.options:

-Xms64m
-Xmx512m

在这里插入图片描述

kibana:7.4.2

https://artifacts.elastic.co/downloads/kibana/kibana-7.4.2-windows-x86_64.zip

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

基本命令

保存一个数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识

PUT customer/external/1;在 customer 索引下的 external 类型下保存 1 号数据为

{ "name": "John Doe"
}

在这里插入图片描述

PUT 和 POST 都可以,

  • POST 新增。如果不指定 id,会自动生成 id。指定 id 就会修改这个数据,并新增版本号
  • PUT 可以新增可以修改。PUT 必须指定 id;由于 PUT 需要指定 id,我们一般都用来做修改操作,不指定 id 会报错。

查询文档
在这里插入图片描述

在这里插入图片描述

ik 分词器

https://github.com/infinilabs/analysis-ik/releases?after=v6.4.2&page=11

放到G:\software\elasticsearch-7.4.2-windows-x86_64\elasticsearch-7.4.2\plugins目录下并解压,然后改目录名为analysis-ik

在这里插入图片描述

使用分词器对比:(默认分词器:standard)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

能够看出不同的分词器,分词有明显的区别,所以以后定义一个索引不能再使用默认的 mapping 了,要手工建立 mapping, 因为要选择分词器。

自定义词库:

利用 nginx 发布静态资源,按照请求路径,创建对应的文件夹以及文件,放在nginx的html目录下

在这里插入图片描述

在这里插入图片描述

修改G:\software\elasticsearch-7.4.2-windows-x86_64\elasticsearch-7.4.2\plugins\analysis-ik\config\IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict"></entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- http://192.168.56.10/fenci/myword.txt 80断口是nginx端口,把这个txt放在nginx中的html目录下 --><entry key="remote_ext_dict">http://192.168.56.10/fenci/myword.txt</entry><!--用户可以在这里配置远程扩展停止词字典--><entry key="remote_ext_stopwords">words_location</entry>
</properties>

重启elasticsearch和kibana后,测试自定义的词库使用效果:

在这里插入图片描述

在这里插入图片描述

注意:

更新完成后,es 只会对新增的数据用新词分词。历史数据是不会重新分词的。如果想要历史数据重新分词。需要执行:

POST my_index/_update_by_query?conflicts=proceed

SpringBoot整合

在这里插入图片描述

在这里插入图片描述

最终选择 Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client):

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

依赖:

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.gulimall</groupId><artifactId>gulimall-search</artifactId><version>0.0.1-SNAPSHOT</version><name>gulimall-search</name><description>ElasticSearch检索服务</description><properties><elasticsearch.version>7.4.2</elasticsearch.version></properties><dependencies><!-- 导入es的rest-high-level-client--><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.4.2</version></dependency></dependencies>
</project>

配置类:

/*** 1、导入依赖* 2、编写配置,给容器中注入一个RestHighLevelClient* 3、参照API https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html*/
@Configuration
public class ElasticSearchConfig {public static final RequestOptions COMMON_OPTIONS;static {RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//        builder.addHeader("Authorization", "Bearer " + TOKEN);
//        builder.setHttpAsyncResponseConsumerFactory(
//                new HttpAsyncResponseConsumerFactory
//                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));COMMON_OPTIONS = builder.build();}@Beanpublic RestHighLevelClient esRestClient(@Value("${spring.elasticsearch.jest.uris}") String esUrl) {//TODO 修改为线上的地址//final String hostname, final int port, final String scheme///        RestClientBuilder builder = RestClient.builder(new HttpHost("192.168.56.10", 9200, "http"));//        RestHighLevelClient client = new RestHighLevelClient(
//                RestClient.builder(
//                        new HttpHost("192.168.56.10", 9200, "http")));return new RestHighLevelClient(RestClient.builder(HttpHost.create(esUrl)));}}
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallSearchApplication {public static void main(String[] args) {SpringApplication.run(GulimallSearchApplication.class, args);}}
spring:elasticsearch:jest:uris: 127.0.0.1:9200

测试存储数据:

    @Testpublic void indexData() throws IOException {IndexRequest indexRequest = new IndexRequest("users");indexRequest.id("1");//数据的id,如果不设置会自动生成id
//        indexRequest.source("userName","zhangsan","age",18,"gender","男");User user = new User();user.setUserName("zhangsan");user.setAge(18);user.setGender("男");String jsonString = JSON.toJSONString(user);indexRequest.source(jsonString, XContentType.JSON);//要保存的内容//执行操作IndexResponse index = client.index(indexRequest, ElasticSearchConfig.COMMON_OPTIONS);//提取有用的响应数据System.out.println(index);}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

将存储的东西转为JSON即可

在这里插入图片描述

测试复杂检索

    @Testpublic void searchData() throws IOException {//1、创建检索请求SearchRequest searchRequest = new SearchRequest();//指定索引searchRequest.indices("bank");//指定DSL,检索条件//SearchSourceBuilder sourceBuilde 封装的条件SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();//1.1)、构造检索条件
//        sourceBuilder.query();
//        sourceBuilder.from();
//        sourceBuilder.size();
//        sourceBuilder.aggregation()sourceBuilder.query(QueryBuilders.matchQuery("address","mill"));//1.2)、按照年龄的值分布进行聚合TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);sourceBuilder.aggregation(ageAgg);//1.3)、计算平均薪资AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");sourceBuilder.aggregation(balanceAvg);System.out.println("检索条件"+sourceBuilder.toString());searchRequest.source(sourceBuilder);//2、执行检索;SearchResponse searchResponse = client.search(searchRequest, ElasticSearchConfig.COMMON_OPTIONS);//3、分析结果 searchResponseSystem.out.println(searchResponse.toString());
//        Map map = JSON.parseObject(searchResponse.toString(), Map.class);//3.1)、获取所有查到的数据SearchHits hits = searchResponse.getHits();SearchHit[] searchHits = hits.getHits();for (SearchHit hit : searchHits) {/*** "_index": "bank",* 			"_type": "account",* 			"_id": "345",* 			"_score": 5.4032025,* 			"_source":*/
//            hit.getIndex();hit.getType();hit.getId();String string = hit.getSourceAsString();Accout accout = JSON.parseObject(string, Accout.class);System.out.println("accout:"+accout);}//3.2)、获取这次检索到的分析信息;Aggregations aggregations = searchResponse.getAggregations();
//        for (Aggregation aggregation : aggregations.asList()) {
//            System.out.println("当前聚合:"+aggregation.getName());
            aggregation.get
//
//        }Terms ageAgg1 = aggregations.get("ageAgg");for (Terms.Bucket bucket : ageAgg1.getBuckets()) {String keyAsString = bucket.getKeyAsString();System.out.println("年龄:"+keyAsString+"==>"+bucket.getDocCount());}Avg balanceAvg1 = aggregations.get("balanceAvg");System.out.println("平均薪资:"+balanceAvg1.getValue());//        Aggregation balanceAvg2 = aggregations.get("balanceAvg");}

同步与异步调用

在这里插入图片描述

在这里插入图片描述

参考

雷丰阳: Java项目《谷粒商城》Java架构师 | 微服务 | 大型电商项目.


本文完,感谢您的关注支持!


这篇关于【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【11】ElasticSearch的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076192

相关文章

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

Eureka高可用注册中心registered-replicas没有分布式注册中心

自己在学习过程中发现,如果Eureka挂掉了,其他的Client就跑不起来了,那既然是商业项目,还是要处理好这个问题,所以决定用《Spring Cloud微服务实战》(PDF版在全栈技术交流群中自行获取)中说的“高可用注册中心”。 一开始我yml的配置是这样的 server:port: 8761eureka:instance:hostname: 127.0.0.1client:fetch-r

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

微服务中RPC的强类型检查与HTTP的弱类型对比

在微服务架构中,服务间的通信是一个至关重要的环节。其中,远程过程调用(RPC)和HTTP是两种最常见的通信方式。虽然它们都能实现服务间的数据交换,但在类型检查方面,RPC的强类型检查和HTTP的弱类型之间有着显著的差异。本文将深入探讨这两种通信方式在类型检查方面的优缺点,以及它们对微服务架构的影响。 一、RPC的强类型检查 RPC的强类型检查是其核心优势之一。在RPC通信中,客户端和服务端都使

响应式架构

介绍 响应式架构(Reactive Architecture)是一种面向服务和事件的系统设计方法,旨在提高系统的可扩展性、弹性和容错能力。它适用于构建分布式系统,特别是在云环境和微服务架构中。响应式架构的核心理念是通过事件驱动和数据流来实现各个组件之间的解耦,从而提高整个系统的响应能力和可靠性。 响应式架构的主要特点包括: 响应性:系统能够快速响应外部事件和内部变化,确保在各种负载和故障情

YTK的高级使用

YTKUrlFilterProtocol 接口 YTKUrlFilterProtocol 接口用于实现对网络请求URL或参数的重写,例如可以统一为网络请求加上一些参数,或者修改一些路径。 例如:在猿题库中,我们需要为每个网络请求加上客户端的版本号作为参数。所以我们实现了如下一个YTKUrlArgumentsFilter 类,实现了 YTKUrlFilterProtocol 接口: //

中国341城市生态系统服务价值数据集(2000-2020年)

生态系统服务反映了人类直接或者间接从自然生态系统中获得的各种惠益,对支撑和维持人类生存和福祉起着重要基础作用。目前针对全国城市尺度的生态系统服务价值的长期评估还相对较少。我们在Xie等(2017)的静态生态系统服务当量因子表基础上,选取净初级生产力,降水量,生物迁移阻力,土壤侵蚀度和道路密度五个变量,对生态系统供给服务、调节服务、支持服务和文化服务共4大类和11小类的当量因子进行了时空调整,计算了

SpringCloud - 微服务

1、微服务介绍         参考: 微服务百度百科 1.1 概念         微服务(或称微服务架构)是一种云原生架构方法,在单个应用中包含众多松散耦合且可单独部署的小型组件或服务。 这些服务通常拥有自己的技术栈,包括数据库和数据管理模型;通过一个REST API、事件流和消息代理组合彼此通信;以及按照业务能力进行组织,具有通常称为有界上下文的服务分隔线。         微服务特

[分布式网络通讯框架]----Zookeeper客户端基本操作----ls、get、create、set、delete

Zookeeper数据结构 zk客户端常用命令 进入客户端 在bin目录下输入./zkCli.sh 查看根目录下数据ls / 注意:要查看哪一个节点,必须把路径写全 查看节点数据信息 get /第一行代码数据,没有的话表示没有数据 创建节点create /sl 20 /sl为节点的路径,20为节点的数据 注意,不能跨越创建,也就是说,创建sl2的时候,必须确保sl