热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ElasticSearch究竟是个什么东西

ElasticSearch究竟是个什么东西-听说微信搜索《Java鱼仔》会变更强!本文收录于JavaStarter,里面有我完整的Java系列文章,学习或面试都可以看看哦(

听说微信搜索《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 创建文档

PUT http://ip:port/索引名/类型名/文档id

{
    "key":"value"
}

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

PUT http://ip:port/索引名/_doc/文档id

下面给出操作截图

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

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

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

PUT http://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)布尔型:boolean6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range

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

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

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

3.4 修改数据

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

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

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

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

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

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

3.5 删除数据

通过DELETE的方式删除数据

DELETE http://ip:port/索引名/类型名/文档id  #删除具体的文档
DELETE http://ip:port/索引名  #删除索引
(四)ES的搜索操作

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

4.1 简单搜索

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

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

结果如下:

4.2 通过param传递参数

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

GET http://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": "",
  "post_tags": "",
  "fields": {
    "name": {}
  }
}

(五)分词器

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

5.1 基本使用

给出下载链接:https://github.com/medcl/elasticsearch-analysis-ik/releases

下载和自己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



<properties>
        <comment>IK Analyzer 扩展配置comment>
        
        <entry key="ext_dict">my.dicentry>
         
        <entry key="ext_stopwords">entry>
        
        
        
        
properties>

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

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

(六)总结

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


推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本教程详细介绍了如何使用 Spring Boot 创建一个简单的 Hello World 应用程序。适合初学者快速上手。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • REST API 时代落幕,GraphQL 持续引领未来
    尽管REST API已广泛使用多年,但在深入了解GraphQL及其解决的核心问题后,我深感其将引领未来的API设计趋势。GraphQL不仅提高了数据查询的效率,还增强了灵活性和性能,有望成为API开发的新标准。 ... [详细]
  • 本文深入探讨了ASP.NET Web API与RESTful架构的设计与实现。ASP.NET Web API 是一个强大的框架,能够简化HTTP服务的开发,使其能够广泛支持各种客户端设备。通过详细分析其核心原理和最佳实践,本文为开发者提供了构建高效、可扩展且易于维护的Web服务的指导。此外,还讨论了如何利用RESTful原则优化API设计,确保系统的灵活性和互操作性。 ... [详细]
  • Go语言中Web服务的实现方式
    这篇文章主要讲解了“Go语言中Web服务的实现方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习 ... [详细]
  • 谈起RESTFUL大家未免都耳熟能详,但是要介绍一下它是什么,可能就是停留在听过或者见过的阶段了。一贯喜欢以通俗的语言来消化知识的小马自然不会放过它了& ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了Springboot常用注解相关的知识,希望对你有一定的参考价值。@SpringBootApplicatio ... [详细]
  • DingoAPI中的转化器(Transformer)有点类似Laravel框架自带的API资源类,都是用于对返回的响应数据进行格式化,通过转化器,你可以轻松实现将对象转化为数组,并支持整型和布尔类型之间的转化,以及分页结果和嵌套关联。这篇教程我们主要讨论转化器在DingoAPI中的使用,这里的转化器包括以下两层意思:在介绍Dingo转化器使用之前,有必要大致了解下其底层实现原理。 ... [详细]
  • 摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的 ... [详细]
author-avatar
梁言一聚
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有