ElasticSearch究竟是个什么东西

简介: ElasticSearch的目标就是实现搜索。在数据量少的时候,我们可以通过索引去搜索关系型数据库中的数据,但是如果数据量很大,搜索的效率就会很低,这个时候我们就需要一种分布式的搜索引擎。Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

听说微信搜索《Java鱼仔》会变更强!


本文收录于JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦


(一)介绍


ElasticSearch的目标就是实现搜索。在数据量少的时候,我们可以通过索引去搜索关系型数据库中的数据,但是如果数据量很大,搜索的效率就会很低,这个时候我们就需要一种分布式的搜索引擎。Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口


ES主要用于全文检索、结构化搜索以及分析。ES的应用十分广泛,比如维基百科、Github等都使用ES实现搜索。


(二)核心概念理解


2.1 数据结构


ES既然是用来搜索的,那么它必然也需要存储数据。在Mysql等关系型数据库中,数据的存储遵循下面的逻辑:


一个数据库(database)中有多个表(tables),每个表有多行数据(rows),每一行数据由多个字段(columns)组成。


ES中的存储是这样的:


一个索引(indeces)相当于一个数据库(database),每个索引中有多个类型types(相当于表结构),每个索引中有多个documents(相当于行),每个documents由多个fields组成(相当于字段)。


你可以把ES理解为他是一个面向文档的数据库。下面用一张图描述ES和关系型数据库之间的相似之处:


网络异常,图片无法展示
|


值得注意的是,在ES7.x版本中,types将慢慢被遗弃,在8.x版本中,types将会彻底弃用。


2.2 索引(indeces)和文档(documents)


ES中的索引和Mysql中的索引不是同一种东西,ES中的索引是一个文档的集合,索引就是一个数据库。


前面说了ES是面向文档的,文档是ES中最重要的单位,文档就是一条条的数据。文档中有几个重要的概念:


1、一篇文档中包含多个key:value


2、文档其实就是一个JSON字符串


2.3 分片


我们通过EShead创建一个索引时,他会让我们选择分片数量和副本数量


网络异常,图片无法展示
|


ES是一个分布式搜索引擎,分片就是把一堆数据分布到多个分片中。而索引是对每个分片的一个备份,这些副本同样能处理查询请求。


现在假设集群有两个node节点,设置分片数是5个,副本数是1个,那么数据存储结构将变成下面这样,可以保证副本和分片在不同的节点上:


网络异常,图片无法展示
|


2.4 倒排索引


为什么ES的搜索这么快,和其中所使用的倒排索引也有一定的关系。倒排索引建立的是分词和文档之间的映射关系。下面通过一个简单的例子来讲解一下什么是倒排索引

网络异常,图片无法展示
|


原来的数据中我们通过文档ID去关联标签,但是在查询时就需要遍历所有文档。通过倒排索引,我们可以通过关键词来找到最匹配的文档。


(三)ES的基本操作


ES是基于Restful风格进行操作的,因此对于习惯了写crud的程序员来说,ES很容易上手。ES的操作可以使用Kibana,也可以使用Postman直接调用,因为归根结底它就是一个restful的操作。我这里使用Idea的ES插件直接调用。 3.1 创建文档


PUThttp://ip:port/索引名/类型名/文档id{
"key":"value"}

因为类型名在后续的版本中将会被删除,这里可以用_doc代表默认类型:

PUThttp://ip:port/索引名/_doc/文档id

下面给出操作截图


网络异常,图片无法展示
|


通过put创建一个索引之后,我们可以在head中看到对应的数据


网络异常,图片无法展示
|


3.2 创建带有数据类型的索引


3.1中创建数据时,没有指定具体的数据类型,我们当然也可以为索引指定数据类型

PUThttp://ip:port/索引名参数示例:{
"mappings": {
"properties": {
"name": {
"type": "text"      },
"address": {
"type": "text"      }
    }
  }
}

ES中的核心数据类型如下:

(1)字符串类型:text, keyword(2)数字类型:long, integer, short, byte, double, float, half_float, scaled_float(3)日期:date(4)日期纳秒:date_nanos(5)布尔型:boolean(6)Binary:binary(7)Range: integer_range, float_range, long_range, double_range, date_range

3.3 查看索引或者文档的数据


通过GET请求可以查看索引以及文档的信息:


GEThttp://ip:port/索引名   #查看索引GEThttp://ip:port/索引名/类型名/文档ID  #查看文档

3.4 修改数据


修改数据和创建数据一样,通过PUT操作就会更新原来的数据:


PUThttp://ip:port/索引名/类型名/文档id{
"key":"value"}

如果是修改的话,响应结果中的version就会增加。


另外一种方法是使用Post请求:


POSThttp://ip:port/索引名/类型名/文档id/_update参数实例:{
"doc": {
"name": "javayz4"  }
}

更推荐使用这种方式,如果使用PUT方法忘了加某个key,更新就会变成新增


3.5 删除数据


通过DELETE的方式删除数据

DELETEhttp://ip:port/索引名/类型名/文档id  #删除具体的文档DELETEhttp://ip:port/索引名  #删除索引

(四)ES的搜索操作


ES最重要的就是它的搜索操作了。


4.1 简单搜索


直接将搜索的参数带到链接中:

GEThttp://ip:port/索引名/_search?q=key:value

结果如下:

网络异常,图片无法展示
|


4.2 通过param传递参数


除了将参数放到链接当中,还可以将参数通过JSON请求体的方式传递,其中from和size是分页的参数query中传递查询条件_source表示结果中要展示的列,不写就表示展示所有。

GEThttp://ip:port/索引名/_search参数示例:{
"from": 0,
"size": 20,
"query": {
"match": {
"name": "javayz2"    }
  },
"_source": ["name","address"]
}

除了上面示例中的这些参数之外,还有很多参数可以使用,比如排序

"sort": [
  {
"age": {
"order": "desc"    }
  }
]

多条件查询:must表示下面的两个条件都要满足,还可以填should,表示任意满足其中一个条件即可,或者是must_not,表示must的相反值

"query": {
"bool": {
"must": [
        {
"match": {
"name": "javayz"          }
        },
        {
"match": {
"address": "hz"          }
        }
      ]
    }
}

如果你的数据中存在集合,可以通过空格对多个条件进行查询:


网络异常,图片无法展示
|


查询过程中还支持高亮查询

"highlight":{
"pre_tags": "<em>",
"post_tags": "</em>",
"fields": {
"name": {}
  }
}

网络异常,图片无法展示
|


(五)分词器


所谓分词器,就是将一段话分成一个个关键字,搜索时就按照这些关键字进行搜索。比较好用的分词器有中文的IK分词器。


5.1 基本使用


给出下载链接:github.com/medcl/elast…


下载和自己ES相同的版本,在plugin目录下新建一个ik文件夹,将下载的文件解压到ik目录下,重新启动即可。


IK分词器提供了两种算法:


1、ik_smart:最少切分


2、ik_max_word:最细粒划分


首先最少切分是根据字典给出最少的切分:


网络异常,图片无法展示
|


ik_max_word是最细粒划分,他会给出最多的结果:


{
"analyzer": "ik_max_word",
"text": "我是Java工程师"}

结果:

{
"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": "java",
"start_offset": 2,
"end_offset": 6,
"type": "ENGLISH",
"position": 2    },
    {
"token": "工程师",
"start_offset": 6,
"end_offset": 9,
"type": "CN_WORD",
"position": 3    },
    {
"token": "工程",
"start_offset": 6,
"end_offset": 8,
"type": "CN_WORD",
"position": 4    },
    {
"token": "师",
"start_offset": 8,
"end_offset": 9,
"type": "CN_CHAR",
"position": 5    }
  ]
}

5.2 字典


对于一些名词,IK自带的字典无法区分,比如我的博客名Java鱼仔,它分词后是这样的:


网络异常,图片无法展示
|


因此我们需要手动去增加这样的字典,IK目录下的config/IKAnalyzer.cfg.xml中可以添加自己的字典,首先我在config下新建一个my.dic文件,里面的词汇现在只写了一个Java鱼仔。然后在配置文件中配置自己的my.dic


<?xmlversion="1.0" encoding="UTF-8"?><!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"><properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entrykey="ext_dict">my.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entrykey="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> --></properties>

重启后再次进行分词,结果如下:


网络异常,图片无法展示
|


如果字典无法被识别,可能是格式等问题。


(六)总结


这篇文章主要对ES的概念以及基本的操作进行讲解,项目中使用时我们会将ES集成到Springboot中。本期的分享就到这了,我是鱼仔,我们下期再见!

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
存储 JavaScript
【开源图床】使用Typora+PicGo+Gitee搭建个人博客图床
【开源图床】使用Typora+PicGo+Gitee搭建个人博客图床
370 2
|
机器学习/深度学习 算法 网络架构
【CVPR2017】AOD-Net:端到端的除雾网络(原理&实操)
【CVPR2017】AOD-Net:端到端的除雾网络(原理&实操)
3125 0
【CVPR2017】AOD-Net:端到端的除雾网络(原理&实操)
|
人工智能 编解码 文字识别
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
OCRmyPDF 是一款开源命令行工具,专为将扫描的 PDF 文件转换为可搜索、可复制的文档。支持多语言、图像优化和多核处理。
1314 17
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
|
弹性计算 运维 自然语言处理
产品测评 | 感受操作系统智能助手OS Copilot新功能带来的运维效率飞升
近期,我再次评测了阿里云OS Copilot的新版本,发现其在命令执行、任务自动化、文件处理及知识问答等方面表现出色,特别是-t参数显著提升了70%的效率。使用过程中,我发现它不仅简化了复杂任务的处理,还提供了中文解释配置文件的功能,极大地方便了初学者。总结来看,OS Copilot极大地提升了Linux运维效率,但仍需在自然语言理解、用户界面优化和错误处理机制等方面进一步改进。未来若能支持更多操作系统并集成更多实用工具,必将成为Linux用户的得力助手。
<select>标记和<option>标签的常用属性
<select>标记和<option>标签的常用属性
659 3
|
JavaScript
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
这篇文章解释了为什么在Vue中组件的`data`属性必须是一个函数而不是一个对象。原因在于组件可能会有多个实例,如果`data`是一个对象,那么这些实例将会共享同一个`data`对象,导致数据污染。而当`data`是一个函数时,每次创建组件实例都会返回一个新的`data`对象,从而确保了数据的隔离。文章通过示例和源码分析,展示了Vue初始化`data`的过程和组件选项合并的原理,最终得出结论:根实例的`data`可以是对象或函数,而组件实例的`data`必须为函数。
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
|
供应链 Shell Python
经济订货量(Economic Order Quantity,简称EOQ)
经济订货量(Economic Order Quantity,简称EOQ)
|
网络协议 安全 Linux
在Linux中,当一台服务器无法ping通其他主机时,可能有哪些原因?
在Linux中,当一台服务器无法ping通其他主机时,可能有哪些原因?
抓包工具 Fiddler 抓取 exe 包
抓包工具 Fiddler 抓取 exe 包
2080 0

热门文章

最新文章