滨州哪里有做网站的,广州白云做网站,做公众号商城原型的网站,汽车seo是什么意思初识 Elasticsearch
认识和安装
Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术#xff0c;属于 Elastic 技术栈的一部分。完整的技术栈包括#xff1a;
Elasticsearch#xff1a;用于数据存储、计算和搜索。Logstash/Beats#xff1a;用于数据收集。Kib…初识 Elasticsearch
认识和安装
Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术属于 Elastic 技术栈的一部分。完整的技术栈包括
Elasticsearch用于数据存储、计算和搜索。Logstash/Beats用于数据收集。Kibana用于数据可视化。
这套技术栈通常被称为 elastic stack (ELK)广泛应用于日志收集、系统监控和状态分析等场景。
而elasticsearch是elastic stack的核心负责存储、搜索、分析数据。 核心组件
Elasticsearch 是整个技术栈的核心提供了强大的数据存储、搜索和分析功能。
Kibana 是一个用于操作 Elasticsearch 的可视化控制台它通过 RESTful API 与 Elasticsearch 进行交互让用户能够更直观地管理和分析数据。Kibana 的主要功能包括
数据搜索与展示支持对 Elasticsearch 数据的灵活搜索和展示。统计与聚合能够对数据进行统计分析并生成图表和报表。集群状态监控提供对 Elasticsearch 集群健康状态的监控。开发控制台DevTools提供语法提示帮助用户更方便地使用 Elasticsearch 的 RESTful API。
安装elasticsearch
通过下面的Docker命令Windows 命令提示符即可安装单机版本的elasticsearch
docker run -d ^--name es ^-e ES_JAVA_OPTS-Xms512m -Xmx512m ^-e discovery.typesingle-node ^-v es-data:/usr/share/elasticsearch/data ^-v es-plugins:/usr/share/elasticsearch/plugins ^--privileged ^--network hm-net ^-p 9200:9200 ^-p 9300:9300 ^elasticsearch:7.12.1安装完成后访问9200端口即可看到响应的Elasticsearch服务的基本信息 安装Kibana
通过下面的Docker命令Windows 命令提示符即可部署Kibana
docker run -d ^--name kibana ^-e ELASTICSEARCH_HOSTShttp://es:9200 ^--networkhm-net ^-p 5601:5601 ^kibana:7.12.1安装完成后直接访问5601端口即可看到控制台页面 选择Explore on my own之后进入主页面 然后选中Dev tools进入开发工具页面 倒排索引
Elasticsearch 之所以能够提供高性能的搜索功能主要归功于其底层的倒排索引技术。倒排索引是一种特殊的数据结构它能够极大地提高文本搜索的效率。
正向索引
在传统的数据库系统中如 MySQL通常使用的是正向索引。正向索引是基于记录的 ID 或其他字段创建的索引。例如给定一个商品表 tb_goods如果为 id 字段创建索引那么根据 id 查询时可以直接通过索引快速定位到记录。
然而如果需要根据 title 字段进行模糊查询传统的正向索引就无法高效地处理。在这种情况下数据库系统通常需要进行全表扫描逐行检查 title 字段是否包含用户搜索的关键词。这种逐行扫描的方式在大数据量的情况下效率非常低下。
倒排索引
倒排索引是对正向索引的一种特殊处理它将文档中的每个词条与包含该词条的文档进行关联。倒排索引中有两个核心概念
文档Document用于搜索的数据单元例如一个网页、一个商品信息等。词条Term对文档数据或用户搜索数据进行分词后得到的具有含义的词语。例如“我是中国人” 可以被分词为 “我”、“是”、“中国人”、“中国”、“国人” 等词条。
创建倒排索引的流程如下
分词将每个文档的数据进行分词得到一个个词条。创建索引表创建一个表每行数据包括词条、词条所在的文档 ID、词条在文档中的位置等信息。索引优化由于词条具有唯一性可以为词条创建索引例如使用哈希表结构索引。
倒排索引的搜索流程如下以搜索 “华为手机” 为例
分词用户输入 “华为手机”对其进行分词得到词条 “华为” 和 “手机”。查找词条拿着词条在倒排索引中查找得到包含这些词条的文档 ID。获取文档根据文档 ID 在正向索引中查找具体的文档。
通过倒排索引搜索过程可以避免全表扫描因为词条和文档 ID 都建立了索引查询速度非常快。
正向索引与倒排索引的对比
正向索引
优点
可以为多个字段创建索引。根据索引字段进行搜索和排序时速度非常快。
缺点
根据非索引字段或索引字段中的部分词条查找时只能进行全表扫描。
倒排索引
优点
根据词条进行搜索和模糊搜索时速度非常快。
缺点
只能为词条创建索引而不是字段。无法根据字段进行排序。
总结来说正向索引适用于精确查询和排序而倒排索引则适用于全文搜索和模糊查询。Elasticsearch 通过结合这两种索引技术提供了高效的全文搜索能力。
基础概念
Elasticsearch 中有许多独特的概念与传统的关系型数据库如 MySQL有所不同但也有相似之处。理解这些概念对于掌握 Elasticsearch 的使用至关重要。
文档和字段
Elasticsearch 是面向文档Document存储的文档可以是数据库中的一条商品数据、一个订单信息等。文档数据会被序列化为 JSON 格式后存储在 Elasticsearch 中。
每个 JSON 文档中包含多个字段Field类似于数据库中的列。字段是文档的基本组成部分每个字段都有其数据类型和值。
索引和映射
索引Index是相同类型的文档的集合。例如
所有用户文档可以组织在一起称为用户的索引。所有商品的文档可以组织在一起称为商品的索引。所有订单的文档可以组织在一起称为订单的索引。
索引类似于数据库中的表。数据库的表会有约束信息用来定义表的结构、字段的名称、类型等信息。因此索引库中就有映射Mapping是索引中文档的字段约束信息类似表的结构约束。
MySQL 与 Elasticsearch 的对比
以下是 MySQL 与 Elasticsearch 中一些关键概念的对比
MySQLElasticsearch说明TableIndex索引Index是文档的集合类似数据库的表TableRowDocument文档Document是一条条的数据类似数据库中的行Row文档都是 JSON 格式ColumnField字段Field是 JSON 文档中的字段类似数据库中的列ColumnSchemaMappingMapping映射是索引中文档的约束例如字段类型约束。类似数据库的表结构SchemaSQLDSLDSL 是 Elasticsearch 提供的 JSON 风格的请求语句用来操作 Elasticsearch实现 CRUD
是否可以完全替代 MySQL
虽然 Elasticsearch 在搜索和分析方面表现出色但它并不能完全替代 MySQL。两者各有擅长之处 MySQL擅长事务类型操作可以确保数据的安全和一致性。 Elasticsearch擅长海量数据的搜索、分析、计算。
在企业中通常会结合使用两者 对安全性要求较高的写操作使用 MySQL 实现。 对查询性能要求较高的搜索需求使用 Elasticsearch 实现。 两者再基于某种方式实现数据的同步保证一致性。 IK 分词器
Elasticsearch 的关键在于倒排索引而倒排索引依赖于对文档内容的分词。分词是将文本数据分解为有意义的词条Term的过程。对于中文文本由于中文没有像英文那样的自然分隔符如空格因此需要专门的中文分词算法。IK 分词器IK Analyzer就是这样一个高效、精准的中文分词工具。
安装 IK 分词器插件
IK 分词器是一个开源的中文分词插件适用于 Elasticsearch。安装 IK 分词器可以显著提高中文文本的分词效果。以下是在 Windows 系统上安装 IK 分词器IK Analyzer的步骤
方案一在线安装
进入 Elasticsearch 容器
运行以下命令进入正在运行的 Elasticsearch 容器
docker exec -it es /bin/bash
安装 IK 分词器插件
在容器内部运行以下命令来安装 IK 分词器插件
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
请注意你需要将 7.12.1 替换为你正在使用的 Elasticsearch 版本号。
退出容器
安装完成后退出容器
exit
重启 Elasticsearch 容器
安装完成后你需要重启 Elasticsearch 容器以使插件生效
docker restart es
方案二离线安装
下载 IK 分词器插件
从 GitHub 页面下载 IK 分词器插件的压缩文件。
将插件文件上传到容器
将下载的压缩文件上传到 Elasticsearch 容器的 /usr/share/elasticsearch/plugins 目录下。你可以使用 docker cp 命令来完成这个操作
docker cp /path/to/elasticsearch-analysis-ik-7.12.1.zip es:/usr/share/elasticsearch/plugins/
进入 Elasticsearch 容器
运行以下命令进入正在运行的 Elasticsearch 容器
docker exec -it es /bin/bash
解压插件文件
在容器内部解压插件文件
cd /usr/share/elasticsearch/plugins
unzip elasticsearch-analysis-ik-7.12.1.zip
rm elasticsearch-analysis-ik-7.12.1.zip
退出容器
解压完成后退出容器
exit
重启 Elasticsearch 容器
安装完成后你需要重启 Elasticsearch 容器以使插件生效
docker restart es
IK分词器包含三种模式
standard标准分词器ik_smart智能语义切分ik_max_word最细粒度切分
首先测试 Elasticsearch 官方提供的标准分词器
POST /_analyze
{analyzer: standard,text: 我是中国人
}
执行结果如下
{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 : 人,start_offset : 4,end_offset : 5,type : IDEOGRAPHIC,position : 4}]
}可以看到标准分词器只能 1 字 1 词条无法正确对中文做分词。
接下来测试 IK 分词器的 ik_smart 模式
POST /_analyze
{analyzer: ik_smart,text: 我是中国人
}
执行结果如下
{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 : 5,type : CN_WORD,position : 2}]
}最后测试 IK 分词器的 ik_max_word 模式
POST /_analyze
{analyzer: ik_max_word,text: 我是中国人
}
执行结果如下
{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 : 5,type : CN_WORD,position : 2},{token : 中国,start_offset : 2,end_offset : 4,type : CN_WORD,position : 3},{token : 国人,start_offset : 3,end_offset : 5,type : CN_WORD,position : 4}]
}IK 分词器的 ik_smart 模式适用于大多数场景能够根据上下文进行智能分词而 ik_max_word 模式则尽可能多地切分出词条适用于需要更细粒度分词的场景。
拓展词典
进入容器后
cd /usr/share/elasticsearch/config/analysis-ik
ls
查看文件内容
cat extra_main.dic 总结
分词器的作用是什么
分词器在搜索引擎中有两个主要作用
创建倒排索引时对文档分词在索引阶段分词器将文档内容分解成一个个的词条tokens并将这些词条与文档关联起来形成倒排索引。倒排索引是搜索引擎的核心数据结构用于快速查找包含特定词条的文档。用户搜索时对输入的内容分词在搜索阶段分词器将用户输入的查询内容分解成一个个的词条然后搜索引擎根据这些词条在倒排索引中查找匹配的文档。
IK 分词器有几种模式
IK 分词器提供了两种分词模式
ik_smart智能切分粗粒度ik_smart 模式会进行智能切分通常会生成较少的词条适用于需要较粗粒度分词的场景。ik_max_word最细切分细粒度ik_max_word 模式会进行最细粒度的切分尽可能生成更多的词条适用于需要细粒度分词的场景。
IK 分词器如何拓展词条如何停用词条
IK 分词器可以通过配置文件 IKAnalyzer.cfg.xml 来拓展词条和停用词条。
拓展词条
在 IKAnalyzer.cfg.xml 文件中通过 entry keyext_dict 标签指定拓展词典文件的路径。在拓展词典文件中添加你想要拓展的词条。
停用词条
在 IKAnalyzer.cfg.xml 文件中通过 entry keyext_stopwords 标签指定停用词典文件的路径。在停用词典文件中添加你想要停用的词条。
示例配置
IKAnalyzer.cfg.xml 示例
?xml version1.0 encodingUTF-8?
!DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd
propertiescommentIK Analyzer 扩展配置/comment!-- 用户可以在这里配置自己的扩展字典 --entry keyext_dictmydict.dic/entry!-- 用户可以在这里配置自己的扩展停止词字典 --entry keyext_stopwordsstopword.dic/entry
/properties
自定义词典文件 mydict.dic 示例
自定义词汇1
自定义词汇2
停用词典文件 stopword.dic 示例
的
是
在