Elasticsearch介绍、安装以及IK分词器 --学习笔记

Elasticsearch 是什么?

Elasticsearch 是一个高度可扩展的开源全文搜索和分析引擎。它允许你以极快的速度存储、搜索和分析大量数据。Elasticsearch 基于 Apache Lucene 构建,提供了一个分布式、多租户能力的全文搜索引擎,带有 HTTP web 接口和无模式 JSON 文档。这意味着你可以用 Elasticsearch 存储、搜索、分析的数据种类非常广泛,几乎可以适用于任何类型的用例。

当项目中需要使用到搜索查询功能时,光靠MySqld的模糊查询就显得心有余而力不足了,模糊查询的匹配要求非常严格,需要搜索结果中必须带有相关关键字,而且当搜索量大了之后,使用MySql进行大量的查询操作效率也会大打折扣。而在Elasticsearch 搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。

Elasticsearch 安装

基于docker环境下的安装命令:

docker run -d \--name 容器名 \-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \-e "discovery.type=single-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/usr/share/elasticsearch/plugins \--privileged \--network 网络名 \-p 9200:9200 \-p 9300:9300 \elasticsearch:版本号

kibana安装

kibanna用于图形化展示Elasticsearch,可以对Elasticsearch进行控制台操作:

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network 网络名 \
-p 5601:5601  \
kibana:7.12.1

倒排索引和正向索引

正向索引机制

在讨论数据库(如MySQL)的查询优化时,重要的是要理解索引的作用及其在模糊查询中的局限性。例如,当对数据库中某一张拥有成千上万条数据的表进行模糊查询时,如使用SQL的LIKE语句,查询性能可能受到影响。假设我们对该表的一个字段使用模糊查询,可能使用类似LIKE '%关键字%'的查询条件。即使查询的第一条记录就是我们需要找的数据,查询操作并不会因此停止。原因在于数据库系统需要找出所有匹配的记录,而不仅仅是第一条匹配的记录。因此,系统不得不继续扫描整张表,以确保没有遗漏任何符合条件的数据。

这种查询效率不高的原因部分在于,标准索引主要优化了精确匹配或范围查询的性能。对于以通配符开始的模糊查询(例如LIKE '%关键字%'),标准索引往往无法被有效利用,因为这违背了索引设计的预期使用方式。

倒排索引机制

倒排索引(Inverted Index)是一种数据库索引方式,它与前面讨论的正向索引或数据库中常用的标准索引不同。倒排索引在文档检索系统,如搜索引擎,以及在一些特定类型的数据库优化中非常关键。它的主要思想是根据文档内容中出现的词汇来建立索引,而不是文档到词汇的映射,这与正向索引正相反。

倒排索引主要由两个部分组成:一是词表(Term List),二是倒排列表(Inverted List)。词表中包含了所有文档中出现的词汇,而对于每个词汇,倒排列表则记录了该词汇出现在哪些文档中,通常还包括词在文档中出现的位置、频率等信息。

也就是说倒排索引会将每个文档中出现的词汇提取出来,记录于倒排列表之中,当查询时,直接根据查询输入中的词汇去找相关词汇的倒排列表记录,就可以直接找到有记录相关词汇的文档了,而不必向正向索引一样每次查询都遍历全表。

倒排索引最典型的应用是在搜索引擎中,它使得用户能在短时间内从互联网的海量信息中找到所需的内容。此外,在一些特定的数据库产品中,特别是那些面向文本检索的数据库系统,也广泛采用倒排索引来优化查询性能和存储效率。

总体而言,倒排索引因其特有的结构和优势,成为了处理大规模文本数据,特别是搜索和文本分析领域的重要技术之一。

那么为什么一个叫做正向索引,一个叫做倒排索引呢?

  • 正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程

  • 倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程

正向索引

  • 优点:

    • 可以给多个字段创建索引

    • 根据索引字段搜索、排序速度非常快

  • 缺点:

    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

  • 优点:

    • 根据词条搜索、模糊搜索时,速度非常快

  • 缺点:

    • 只能给词条创建索引,而不是字段

    • 无法根据字段做排序

文档和字段

elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中:

因此,原本数据库中的一行数据就是ES中的一个JSON文档;而数据库中每行数据都包含很多列,这些列就转换为JSON文档中的字段(Field)。 

索引和映射

随着业务发展,需要在es中存储的文档也会越来越多,比如有商品的文档、用户的文档、订单文档等等。

所有文档都散乱存放显然非常混乱,也不方便管理。

因此,我们要将类型相同的文档集中在一起管理,称为索引(Index)

例如:

商品索引

{"id": 1,"title": "小米手机","price": 3499
}{"id": 2,"title": "华为手机","price": 4999
}{"id": 3,"title": "三星手机","price": 3999
}

用户索引

{"id": 101,"name": "张三","age": 21
}{"id": 102,"name": "李四","age": 24
}{"id": 103,"name": "麻子","age": 18
}
  • 所有用户文档,就可以组织在一起,称为用户的索引;

  • 所有商品的文档,可以组织在一起,称为商品的索引;

因此,我们可以把索引当做是数据库中的表。

数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。

mysql与elasticsearch

MySQL

Elasticsearch

说明

Table

Index

索引(index),就是文档的集合,类似数据库的表(table)

Row

Document

文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式

Column

Field

字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)

Schema

Mapping

Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)

SQL

DSL

DSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

IK分词器

Elasticsearch的关键就是倒排索引,而倒排索引依赖于对文档内容的分词,而分词则需要高效、精准的分词算法,IK分词器就是这样一个中文分词算法。

安装Ik分词器

方法一

下载好分词器,然后上传到Elasticsearch挂载的插件目录。

方法二

在线安装,运行命令,然后重启容器:

docker exec -it es ./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

IK分词器的使用

IK分词器包含两种模式:

  • ik_smart:智能语义切分

  • ik_max_word:最细粒度切分

只需要在创建索引库时指定"analyzer"字段的值为IK分词器,相当于告诉Elasticsearch用什么分词器对该索引库进行分词:

 "analyzer": "ik_smart",

当然,虽然IK分词器可以对大部分常规的词汇进行分词,但对于紧跟时代潮流涌现的那些时下热词之类的,依旧是无法进行分词的,此时就需要自己拓展词典。

拓展词典

1)打开IK分词器config目录:

注意,如果采用在线安装的通过,默认是没有config目录的,需要自行下载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">ext.dic</entry>
</properties>

在IK分词器的config目录新建一个 ext.dic:

蔡徐坤
坤哥
坤坤
鸡你太美
666

这下对于那些网络热词也可以进行分词了

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

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

相关文章

深入MySQL中的IF和IFNULL函数

在数据库查询中&#xff0c;我们经常需要根据条件来决定数据的显示方式。MySQL提供了多种内置函数来帮助我们实现这种条件逻辑&#xff0c;其中IF和IFNULL是两个非常有用的函数。在这篇博客中&#xff0c;我们将深入探讨这两个函数的用法和它们在实际查询中的应用。 IF函数 I…

笔记小结:现代卷积神经网络之批量归一化

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;&#xf…

React中引入使用本地图片

1、css样式中&#xff0c;可以写成如下&#xff1a; .login {// 映射路径background: url(images/img-login.png)&#xff1b;background-size: 100% 100%; } .box{// 相对路径background: url(../assets/images/box.png)&#xff1b;background-size: 100% 100%; }2、在jsx文…

Redis-10大数据类型理解与测试

Redis10大数据类型 我要打10个1.redis字符串(String)2.redis列表(List)3.redis哈希表(Hash)4.redis集合(Set)5.redis有序集合(ZSet)6.redis地理空间(GEO)7.redis基数统计(HyperLogLog)8.redis位图(bitmap)9.redis位域(bitfield)10.redis流(Stream) 官网地址Redis 键(key)常用案…

Odoo Registry 源码解读:前端世界的魔法师

亲爱的Odoo探险家们,准备好踏上一段奇妙的代码冒险了吗?今天,我们要深入探索Odoo前端世界的一位神秘大师——Registry。它可能不像那些花哨的UI组件那样引人注目,但要知道,真正的高手都是低调的。Registry就像是Odoo世界里的甘道夫,默默地用魔法维持着整个中土世界的平衡…

卷与nfs实现多台主机容器之间的数据共享

容器存放数据到宿主机里 数据持久化&#xff1a;永久保存 数据共享&#xff1a;容器和容器 容器和宿主机 就是宿主机里的文件夹 /var/lib/docker/volumes docker 容器&#xff1a;容器运行起来是一个进程&#xff0c;进程的数据默认都在内存里&#xff0c;内存里的数据停电…

鸿蒙界面开发

界面开发 //构建 → 界面 build() {//行Row(){//列Column(){//文本 函数名(参数) 对象.方法名&#xff08;参数&#xff09; 枚举名.变量名Text(this.message).fontSize(40)//设置文本大小.fontWeight(FontWeight.Bold)//设置文本粗细.fontColor(#ff2152)//设置文本颜色}.widt…

邮件流量分析

邮件流量分析是指对邮件系统中进出的邮件数量、类型、流向以及相关性能指标进行统计和评估的过程。这种分析有助于优化邮件系统的性能、检测异常活动、防止垃圾邮件和网络攻击&#xff0c;以及改善邮件营销策略。邮件流量分析可以分为几个主要方面&#xff1a; 邮件统计&#x…

MMROTATE的混淆矩阵confusion matrix生成

mmdetection中加入了混淆矩阵生成并可视化的功能&#xff0c;具体的代码在tools/analysis_tools/confusion_matrix.py。 mmrotate由于主流遥感数据集中的DOTA数据集标注格式问题&#xff0c;做了一些修改&#xff0c;所以我们如果是做遥感图像检测的Dota数据集的混淆矩阵&…

安装CUDA Cudnn Pytorch(GPU版本)步骤

一.先看自己的电脑NVIDIA 支持CUDA版本是多少&#xff1f; 1.打开NVIDIA控制面板 2.点击帮助---系统信息--组件 我的支持CUDA11.6 二.再看支持Pytorch的CUDA版本 三.打开CUDA官网 下载CUDA 11.6 下载好后&#xff0c;安装 选择 自定义 然后安装位置 &#xff08;先去F盘…

Python - conda使用大全

如何使用Conda&#xff1f; 环境 创建环境 conda create -n spider_env python3.10.11查看环境 conda env listconda info -e激活环境 conda activate spider_env退出环境 conda deactivate删除环境 conda env remove -n spider_env包 导出包 说明&#xff1a;导出当前虚拟…

孙健提到的实验室的研究方向之一是什么?()

孙健提到的实验室的研究方向之一是什么?&#xff08;&#xff09; 点击查看答案 A.虚拟现实B.环境感知和理解 C.智能体博弈D.所有选项都正确 图灵奖是在哪一年设立的?&#xff08;&#xff09; A.1962B.1966 C.1976D.1986 孙健代表的实验室的前身主要研究什么?&…

【ffmpeg命令入门】ffplay常用命令

文章目录 前言ffplay的简介FFplay 的基本用法常用参数及其作用示例 效果演示图播放普通视频播放网络媒体流RTSP 总结 前言 FFplay 是 FFmpeg 套件中的一个强大的媒体播放器&#xff0c;它基于命令行接口&#xff0c;允许用户以灵活且高效的方式播放音频和视频文件。作为一个简…

英语中英镑与美元表达方式的异同点(英镑£(GBP)和美元$(USD))便士p(pence),美分¢(cents)

文章目录 英语中英镑与美元表达方式的异同点分析货币符号与位置货币符号位置规则 数字格式与分隔数字表示小数点使用 小数单位英镑的便士美元的分 示例分析&#xff08;&#x1f635;&#xff09;示例1&#xff1a;高额交易示例2&#xff1a;零售价格 总结 英语中英镑与美元表达…

自定义QDialog使用详解

自定义QDialog使用详解 一、创建 QDialog 对象二、QDialog设置布局三、QDialog控制模态行为3.1 模态和非模态区别3.2 QDialog的模态使用四、使用 QDialogButtonBox五、处理对话框的结果六、使用 QDialog 的信号和槽QDialog是Qt框架中用于创建对话框窗口的基本类。对话框窗口通常…

uniapp原生插件开发实战——iOS打开文件到自己的app

用原生开发获取文件的名称、路径等能力封装为一个插件包供前端使用 首先根据ios插件开发教程&#xff0c;创建一个插件工程&#xff0c;template 选framework 开始编写代码&#xff1a; iOS 9 及以下版本会调用以下方法&#xff1a; - (BOOL)application:(UIApplication *_N…

【数据分析详细教学】全球气温变迁:一个多世纪的数据分析

全球气温变迁&#xff1a;一个多世纪的数据分析 1. 数据集选择与获取 数据可以从NASA的GISTEMP数据集获取&#xff0c;通常提供的格式有TXT和CSV。我们假设数据是以CSV格式提供。 2. 数据预处理 使用Python的pandas库读取数据并进行预处理。 import pandas as pd# 加载数…

C#知识|账号管理系统:修改登录密码界面的UI设计

哈喽,你好啊!我是雷工! 本节记录添加修改登录密码界面的过程,以下为练习笔记。 01 效果演示 演示跳转打开修改登录密码子窗体效果: 02 添加窗体 在UI层添加一个Windows窗体,命名为:FrmModifyPwd.cs; 03 设置窗体属性 按照下表的内容设置窗体的相关属性: 设置属性 …

物联网架构之Hadoop

一&#xff1a;系统环境设置&#xff08;所有节点都设置&#xff09; 1&#xff1a;关闭selinux和防火墙 setenforce 0 sed -i /^SELINUX/s/enforcing/disabled/ /etc/selinux/config systemctl stop firewalld systemctl disable firewalld 2&#xff1a;为各个节点设置主机名…

编译期计算

关于编译期计算&#xff0c;直接能够想到的应用是决定是否启用某个模板&#xff0c;或者多个模板之间做选择。但如果有足够多的信息&#xff0c;编译器甚至可以计算控制流的结果。 模板元编程 模板元编程的简单例子&#xff0c;如下&#xff1a; #include <iostream>te…