初识ElasticSearch

一、了解ES

1.1 什么是 ElasticSearch

1、ElasticSearch 是一款非常强大的开源搜索引擎,可以帮助我们从海量的数据中快速的找到需要的内容。
2、ElasticSearch 结合 Kibana、Logstash、Beats、也就是Elastic Stach(ELK)。被广泛应用在日志数据分析、实时监控等领域。
3、ElasticSearch 是Elastic Stack 的核心,负责存储、搜索、分析数据。
在这里插入图片描述

1.2 ElasticSearch 的发展

1、Lucene 是一个 Java 语言的搜索引擎类库,是 Apache 公司的顶级项目,由 DougCutting 于1999年研发。
官网地址:https://lucene.apache.org
2、Lucene 的优势:易扩展、高性能(基于倒排索引)
3、Lucene 的缺点:只限于 Java 语言使用、学习曲线陡峭、不支持水平扩展
4、2004年基于 Lucene 开发了 Compass,2010年重写 Compass ,取名为 ElasticSearch。
相比 Lucene ,ElasticSearch 具有以下优势:

  • 支持分布式,可水平扩展
  • 提供 Restful 接口,可被任何语言调用

二、倒排索引

2.1 正向索引与倒排索引

传统数据库(如Mysql)采用正向索引,例如:如下表(tb_goods)中的 id 创建索引:
基于文档 id 创建索引,查询词条时必须先找到文档,而后判断是否包含词条。
在这里插入图片描述
ElasticSearch 采用倒排索引:

  • 文档(document): 每条数据就是一个文档
  • 词条(term): 文档按照语义分成的词语

对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档 id,而后获取文档。
在这里插入图片描述
在这里插入图片描述

三、ES 基本概念

3.1 文档

1、ElasticSearch 是 面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。
2、文档数据会被序列化为 json 格式后存储在 ElasticSearch 中。
在这里插入图片描述

3.2 索引

1、索引(index): 相同类型的文档的集合。
2、映射(mapping):索引中稳定的额字段约束信息,类似表的结构约束。
在这里插入图片描述
在这里插入图片描述

3.3 概念对比

在这里插入图片描述

3.4 架构

Mysql:擅长事务类型的操作,可以确保数据的安全性和一致性。
ElasticSearch:擅长海量数据的搜索、分析、计算
在这里插入图片描述

3.5 分词器

1、ES 在创建倒排索引时会对文档分词;在搜索时,需要对用户输入的内容分词。但默认的分词规则对中文处理并不友好,

语法说明:

  • POST:请求方式
  • /_analyze:请求路径,这里省略了 http://ip:9200,Kibana 自动补充
  • 请求参数,json 风格:
    analyzer:分词器类型,这里是默认的 standard 分词器
    text:要分词的内容

使用 Kibana 的 DevTools 中测试:

POST /_analyze
{"text":"我是一名go和php程序猿","analyzer":"standard"
}

测试结果:显然词条分词对中文不友好。

{"tokens":[{"token":"我","start_offset":0,"end_offset":1,"type":"<IDEOGRAPHIC>","position":0},{"token":"是","start_offset":1,"end_offset":2,"type":"<IDEOGRAPHIC>","position":1},{"token":"一","start_offset":2,"end_offset":3,"type":"<IDEOGRAPHIC>","position":2},{"token":"名","start_offset":3,"end_offset":4,"type":"<IDEOGRAPHIC>","position":3},{"token":"go","start_offset":4,"end_offset":6,"type":"<ALPHANUM>","position":4},{"token":"和","start_offset":6,"end_offset":7,"type":"<IDEOGRAPHIC>","position":5},{"token":"php","start_offset":7,"end_offset":10,"type":"<ALPHANUM>","position":6},{"token":"程","start_offset":10,"end_offset":11,"type":"<IDEOGRAPHIC>","position":7},{"token":"序","start_offset":11,"end_offset":12,"type":"<IDEOGRAPHIC>","position":8},{"token":"猿","start_offset":12,"end_offset":13,"type":"<IDEOGRAPHIC>","position":9}]}

2、处理中文分词,一般使用 IK 分词器。Github地址:https://github.com/infinilabs/analysis-ik
安装命令:

> bin/elasticsearch-plugin install https://get.infini.cloud/elasticsearch/analysis-ik/8.4.1 # 注意版本要一致

IK 分词器两种模式

  • ik_smart:智能切分,最少切分,粗粒度
  • ik_max_word:最细切分,细粒度

使用 Kibana 的 DevTools 中测试 ik_smart:

POST /_analyze
{"text":"我是一名go和php程序猿","analyzer":"ik_smart"
}

测试结果:

{"tokens":[{"token":"我","start_offset":0,"end_offset":1,"type":"CN_CHAR","position":0},{"token":"是","start_offset":1,"end_offset":2,"type":"CN_CHAR","position":1},{"token":"一名","start_offset":2,"end_offset":4,"type":"CN_WORD","position":2},{"token":"一","start_offset":2,"end_offset":3,"type":"TYPE_CNUM","position":3},{"token":"名","start_offset":3,"end_offset":4,"type":"COUNT","position":4},{"token":"go","start_offset":4,"end_offset":6,"type":"ENGLISH","position":5},{"token":"和","start_offset":6,"end_offset":7,"type":"CN_CHAR","position":6},{"token":"php","start_offset":7,"end_offset":10,"type":"ENGLISH","position":7},{"token":"程序","start_offset":10,"end_offset":12,"type":"CN_WORD","position":8},{"token":"猿","start_offset":12,"end_offset":13,"type":"CN_CHAR","position":9}]}

使用 Kibana 的 DevTools 中测试 ik_max_word:

POST /_analyze
{"text":"我是一名go和php程序猿","analyzer":"ik_max_word"
}

测试结果:

{"tokens":[{"token":"我","start_offset":0,"end_offset":1,"type":"CN_CHAR","position":0},{"token":"是","start_offset":1,"end_offset":2,"type":"CN_CHAR","position":1},{"token":"一名","start_offset":2,"end_offset":4,"type":"CN_WORD","position":2},{"token":"一","start_offset":2,"end_offset":3,"type":"TYPE_CNUM","position":3},{"token":"名","start_offset":3,"end_offset":4,"type":"COUNT","position":4},{"token":"go","start_offset":4,"end_offset":6,"type":"ENGLISH","position":5},{"token":"php","start_offset":7,"end_offset":10,"type":"ENGLISH","position":6},{"token":"和","start_offset":10,"end_offset":13,"type":"CN_WORD","position":7},{"token":"程序","start_offset":10,"end_offset":12,"type":"CN_WORD","position":8},{"token":"猿","start_offset":12,"end_offset":13,"type":"CN_CHAR","position":9}]}

3、分词器拓展词库
3.1 修改 ik 分词器目录中的 config 目录中的 IKAnalyzer.cfg.xml 文件

> vim /www/server/elasticsearch/config/analysis-ik/IKAnalyzer.cfg.xml
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic</entry>      			# 定义 ext.dic 文件名<!--用户可以在这里配置自己的扩展停止词字典-->			# 定义 stopword.dic 文件名
<entry key="ext_stopwords">stopword.dic</entry>

3.2 扩展字典:

> vim ext.dic# 添加 "程序猿"

3.3 排除字典:

> vim stopword.dic# 添加 "和"

3.4 重启 ES

3.5 测试结果: “程序猿” 变成了一个新词,"和"已经不解析了

{"tokens":[{"token":"我","start_offset":0,"end_offset":1,"type":"CN_CHAR","position":0},{"token":"是","start_offset":1,"end_offset":2,"type":"CN_CHAR","position":1},{"token":"一名","start_offset":2,"end_offset":4,"type":"CN_WORD","position":2},{"token":"一","start_offset":2,"end_offset":3,"type":"TYPE_CNUM","position":3},{"token":"名","start_offset":3,"end_offset":4,"type":"COUNT","position":4},{"token":"go","start_offset":4,"end_offset":6,"type":"ENGLISH","position":5},{"token":"php","start_offset":7,"end_offset":10,"type":"ENGLISH","position":6},{"token":"程序猿","start_offset":10,"end_offset":13,"type":"CN_WORD","position":7},{"token":"程序","start_offset":10,"end_offset":12,"type":"CN_WORD","position":8},{"token":"猿","start_offset":12,"end_offset":13,"type":"CN_CHAR","position":9}]}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472735.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

1. hbase-phoenix的应用 1.1 概述&#xff1a; 上面我们学会了hbase的操作和原理&#xff0c;以及外部集成的mr的计算方式&#xff0c;但是我们在使用hbase的时候&#xff0c;有的时候我们要直接操作hbase做部分数据的查询和插入&#xff0c;这种原生的方式操作在工作过程中还…

Redis在高性能缓存中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 引言 Redis 概述 定义与原理 发展历程 Redi…

MySQL初学之旅(3)约束

目录 1.前言 2.正文 2.1约束类型 2.2NULL约束 2.3UNIQUE约束 2.4DEFAULT约束 2.5PRIMARY KEY主键约束 2.6FOREIGN KEY外键约束 2.7CHECK约束 3.小结 1.前言 哈喽大家好啊&#xff0c;今儿来继续给大家分享最近学习的MySQL和约束相关的知识点&#xff0c;希望大家一起…

RHCE的学习(20)

变量5种赋值方式 shell中变量赋值5种方式&#xff0c;其中采用name10的方法称A 直接赋值 nameB read命令 read v1C 使用命令行参数 &#xff08;$1 $2 $3 ..&#xff09; name$1D 使用命令的输入 username$(whoami)E 从文件读取 #cut -d : -f1 /etc/passwd > /user.listfor…

Java项目实战II基于微信小程序的电子商城购物平台(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网…

Godot的开发框架应当是什么样子的?

目录 前言 全局协程还是实例协程&#xff1f; 存档&#xff01; 全局管理类&#xff1f; UI框架&#xff1f; Godot中的异步&#xff08;多线程&#xff09;加载 Godot中的ScriptableObject 游戏流程思考 结语 前言 这是一篇杂谈&#xff0c;主要内容是对我…

【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 前言&#x1f4cc; 1. 优先级队列、容器适配器和 deque 概述✨1.1 什么是优…

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 &#xff08;一&#xff09;三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式&#xff0c;一种是 C/S 架构&#xff0c;也就是客户端/服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就是浏览器服务器。在 JavaEE 开发中&…

Jav项目实战II基于微信小程序的助农扶贫的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在当前社会…

Ubuntu安装ollama,并运行ollama和通义千问,使用gradio做界面

Ubuntu安装ollama&#xff0c;并运行ollama和通义千问 安装ollama方式一&#xff1a;方式二 下载安装模型运行大模型运行ollama服务前端的实现python环境安装修改pip国内源前端页面搭建测试前后端联通设计完整的ui 安装ollama 方式一&#xff1a; 访问网站连接&#xff0c;选…

对接阿里云实人认证

对接阿里云实人认证-身份二要素核验接口整理 目录 应用场景 接口文档 接口信息 请求参数 响应参数 调试 阿里云openApi平台调试 查看调用结果 查看SDK示例 下载SDK 遇到问题 本地调试 总结 应用场景 项目有一个提现的场景&#xff0c;需要用户真实的身份信息。 …

C++ 的发展

目录 C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&#xf…

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…

六自由度双足机器人运动控制

最近迷上了研究机器人&#xff0c;花了很多时间研究机器人的控制和交互。先后开发出来了四足四自自由度&#xff0c;四足八自由度&#xff0c;两足四自由度&#xff0c;两足六自由度机器人&#xff0c;并为他们开发了相应的大模型语音交互。通过努力&#xff0c;既锻炼了动手组…

超好用shell脚本NuShell mac安装

利用管道控制任意系统 Nu 可以在 Linux、macOS 和 Windows 上运行。一次学习&#xff0c;处处可用。 一切皆数据 Nu 管道使用结构化数据&#xff0c;你可以用同样的方式安全地选择&#xff0c;过滤和排序。停止解析字符串&#xff0c;开始解决问题。 强大的插件系统 具备强…

第9章 DIV+CSS布局作业

html代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>服务中心</title><link type"text/css" href"../css/322-1.css" rel"stylesheet"/></head><body><di…

nginx源码安装配置ssl域名

nginx源码安装 下载 wget http://nginx.org/download/nginx-1.24.0.tar.gz 解压 tar -zxvf nginx-1.24.0.tar.gz 下载openssl apt install openssl 安装nginx cd nginx-1.24.0 sudo apt-get install libpcre3 libpcre3-dev ./configure --prefix=/home/nginx24 --with-http_ss…

【Linux:IO多路复用(select、poll函数)

目录 什么是IO多路复用&#xff1f; select: 参数介绍&#xff1a; select函数返回值&#xff1a; fd_set类型&#xff1a; 内核如何更新集合中的标志位 处理并发问题 处理流程的步骤&#xff1a; poll: poll的函数原型&#xff1a; 参数介绍&#xff1a; select与p…

容器内的Jenkins使用docker部署服务,服务数据文件挂载问题

问题 docker 容器运行服务更推荐是那种无状态的服务&#xff0c;这样可以做到 “ 开箱即用 ”&#xff0c;需要持久化存储的话使用存储卷挂载数据库文件即可&#xff0c;这都是基于在宿主机上执行的&#xff1b; 现在Jenkins是在docker容器中运行&#xff0c;并需要使用docker部…

六、volatile

volatile 能保证内存可⻅性 运行下面的例子&#xff1a; package Demo03;import java.util.Scanner;public class demo01 {private static int flag 0;public static void main(String[] args) {Thread t1 new Thread(() -> {while (flag 0) {}System.out.println(&quo…