Elasticsearch从入门到精通

Elasticsearch简介

应用开发中一个比较常见的功能是搜索,传统应用的解决方案:数据库的模糊查询。

模糊查询存在的问题:

  • 海量数据下效率低下
  • 功能不够丰富:不够智能、不能高亮

Elasticsearch 是一个分布式RESTful 风格的搜索和数据分析引擎。能够在海量的结构化和非结构化的数据中进行快速搜索,帮助我们完成诸如 订单搜索、商品推荐、日志分析、性能监控 等功能。

和Elasticsearch类似的产品还有Apache组织开源的Solr ,Solr和Elasticsearch都是基于Lucene这个Java类库二次开发而成的框架。Solr在功能性、传统搜索应用方面的表现更好,Elasticsearch则在新兴的实时搜索表现更佳。Solr的发展一直都比较平稳,近些年来呈现渐渐的下降趋势,而Elasticsearch则呈现明显上升的趋势。

Elasticsearch的特点:

  • Elasticsearch是基于Lucene(Java全文检索工具)的开发的搜索引擎
  • Elasticsearch支持分布式多用户访问,可以轻松的扩展到上百台服务器
  • Elasticsearch是近实时的不是实时的搜索引擎,简单说插入一条新数据后并不能保证立刻搜索到,但保证在1s内一定可以搜索到
  • Elasticsearch通过简单的RESTful API来隐藏Lucene的复杂性,使得全文检索变得简单
  • Elasticsearch使用JSON格式存储数据

接下来就来讲解一下Elasticsearch的安装使用

Elasticsearch安装

  1. 安装elasticsearch首先需要安装jdk环境
    (如何安装jdk可以查阅博主之前的文章的前三步Tomcat的安装及配置)
  2. 修改配置文件limits.conf
    vi /etc/security/limits.conf
在最后一行添加下面内容
* soft nofile 65536
* hard nofile 65536
* soft nproc  4096
* hard nproc  4096
  1. 修改sysctl.conf
    vi /etc/sysctl.conf
最后一行添加
vm.max_map_count=262144

运行该命令让sysctl生效
sysctl -p

  1. 把es安装包上传到opt文件夹里面进行解压
    下载链接:https://pan.baidu.com/s/1_fnyYhUkM-m3QPIQK6xcEg
    提取码:iw14
tar -zxvf elasticsearch-6.4.1.tar.gz
  1. 修改es的配置文件允许远程访问
[root@localhost config]# vi elasticsearch.yml 
将55行
#network.host: 192.168.0.1 
改为:
network.host: 0.0.0.0 

注意去除前面的#

  1. 尝试启动es:在这里插入图片描述
    es不能使用root用户启动。我们需要添加其他用户。

  2. 添加es用户,修改es文件夹的所属用户为es,elasticsearch不能使用root用户启动。
    在这里插入图片描述
    在这里插入图片描述
    所以我们需要通过linux的权限命令对文件夹进行修改所属用户。

  3. 使用es用户登录到linux里面,启动es

在这里插入图片描述

Elasticsearch使用操作

REST 回顾

REST(Resource Representational State Transfer)资源在网络传输中以某种表现形式进行状态转移。

REST风格的URI:

  • 面向资源
  • 通过HTTP的请求方式对资源进行操作

HTTP请求方式:

  • GET 对资源的查询
  • POST 对资源的新增或者更新
  • PUT 对资源的更新或者新增
  • DELETE 对资源的删除

RESTful API操作Elasticsearch

Elasticsearch数据相关的概念:

  • 文档:json格式的数据,类似关系型数据库的一行数据。每个文档都会有唯一的id,可以由es生成,也可以由程序员指定
  • 字段:每一个文档中的数据字段就相当于关系型数据库中一行的列
  • 类型:Elasticsearch中保存数据的容器,类似于MySQL中的表
  • 索引:保存有类型,类似于mysql的数据库。
序号Elasticsearchmysql
1索引
2类型
3文档
4字段

为方便大家前期对Elasticsearch的数据有一个大体的认识,可以类比关系型数据库的一些概念,但注意2者之间有本质差别不可等价齐观。(ES里一个索引只能有一个类型,而mysql里面一个库里面可以有许多表)

在这里再给大家推荐一个操作es的软件postman(博主在这里提供的是破解版,仅供个人学习使用,另外不要更新软件否则可能会收费)
下载链接:https://pan.baidu.com/s/1f-n7KqjOdISYyDEYnWbI2Q
提取码:0nsi

创建和删除索引
  1. 创建索引和类型:
    PUT /索引名
{"mappings":{"类型名":{"properties":{"字段名":{"type":"字段类型"},"字段名":{"type":"字段类型"}}}}
}

字段类型:

字符串:keyword,text
数值类型:long,integer,short,byte,double,float
布尔:boolean
日期:date
二进制:binary

案例:
PUT http://192.168.240.137:9200/bookshop

{"mappings":{"book":{"properties":{"name":{"type":"keyword"},"price":{"type":"double"},"date":{"type":"date"}}}}
}

在这里插入图片描述

  1. 查看索引
    GET /索引名/_mappings
    案例:
    GET http://192.168.240.137:9200/bookshop/_mappings
    结果:
{"bookshop": {"mappings": {"book": {"properties": {"date": {"type": "date"},"name": {"type": "keyword"},"price": {"type": "double"}}}}}
}

在这里插入图片描述

  1. 删除索引
    DELETE /索引名
    案例:
    DELETE http://192.168.240.137:9200/bookshop
{"acknowledged": true
}

在这里插入图片描述

补充一下:
删除所有索引
DELETE http://192.168.240.137:9200/*

  1. 查询当前所有的索引
    GET http://192.168.240.137:9200/_cat/indices?v

在这里插入图片描述

添加(修改)和删除文档
  1. 添加文档
    POST http://192.168.240.137:9200/bookshop/book/1
{"name":"西游记","price":10,"date":"2012-12-12"
}

在这里插入图片描述

其中id也可以不添加,系统会自动给我们创建一个id值。补充一下,如果索引和文档不存在,系统也会自动给我们创建。如果字段不存在,系统也会自动添加。

由es分配id

POST http://192.168.240.137:9200/bookshop/book

{"name":"水浒传","price":10,"date":"2012-10-10"
}

在这里插入图片描述

#指定文档的id

POST http://192.168.240.137:9200/bookshop/book/2

{"name":"三国演义","price":10,"date":"2023-11-12"
}

在这里插入图片描述

  1. 查询文档
    GET /索引/类型/id值
    案例:
    示例:
    查看全部
    GET http://192.168.240.137:9200/bookshop/book/_search
    在这里插入图片描述
    查看id为1的数据
    GET http://192.168.240.137:9200/bookshop/book/1
    在这里插入图片描述

  2. 删除文档
    DELETE /索引/类型/id
    案例:
    DELETE http://192.168.240.137:9200/bookshop/book/Ut8URIwBjRBsHr8AOytd

在这里插入图片描述

  1. 更新(修改)文档
    POST /索引/类型/id
    POST http://192.168.240.137:9200/bookshop/book/2
{"name":"三国","price":10,"date":"2023-11-12","product_address":"made in China"
}

在这里插入图片描述
这里的更新(修改)会直接覆盖掉原来的,如果字段不存在,会新建。

批量操作
批量写 _bulk

Bulk API支持在一次请求中,可以对任意的索引执行多种不同的写操作。
PUT /_bulk

{操作类型以及操作的索引 类型 文档id信息}
{操作用到的数据}

注意最后必须添加一个空行

案例:
PUT http://192.168.146.40:9200/_bulk

{"index":{"_index":"dangdang","_type":"book","_id":"1"}}
{"bookName":"红楼梦","author":"曹雪芹","price":19800.0}
{"update":{"_index":"dangdang","_type":"book","_id":"1"}}
{"doc":{"price":"1980.0"}}
{"create":{"_index":"dangdang","_type":"book","_id":"2"}}
{"bookName":"水浒传","author":"施耐庵"}
{"delete":{"_index":"dangdang","_type":"book","_id":"3"}}

注意

  • json数据不能主动换行,必须写成一行
  • 多个json间必须要换行
  • 在文件中json串最后一行下方必须再有一个空行

扩展:
如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:
PUT http://192.168.146.40:9200/dangdang/book/_bulk

{"index":{"_id":"1"}}
{"bookName":"红楼梦","author":"曹雪芹","price":19800.0}
{"index":{"_id":"1"}}
{"doc":{"price":"1980.0"}}
{"create":{"_id":"2"}}
{"bookName":"水浒传","author":"施耐庵"}
{"delete":{"_id":"3"}}

操作中单条操作的失败,不会影响其它操作。返回结果中包含了每一条操作的结果(成功或者失败)。

批量读 _mget

可以一次性的查询多个数据,减少网络连接产生的开销,提高性能。

GET /_mget

{"docs":[{索引 类型 等信息},...]
}     

案例:
GET http://192.168.146.40:9200/_mget

{"docs":[{"_index":"dangdang","_type":"book","_id":1},{"_index":"dangdang","_type":"book","_id":2}]
}  

如果在URI路径上指定了索引和类型,那么操作时json串中的条件可以省略对应的值,上面的操作也可以写成如下所示:
GET http://192.168.146.40:9200/dangdang/book/_mget

{"docs":[{"_id":1},{"_id":2}]
}

Elasticsearch高级检索DSL检索

不安装其他插件的情况下,es默认是不支持中文的分词查询的
准备测试数据:
添加索引并设置类型
PUT /ems

{ "mappings":{ "emp":{ "properties":{ "name":{ "type":"text" }, "age":{ "type":"integer" }, "bir":{ "type":"date","format": "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis"}, "content":{ "type":"text" }, "address":{ "type":"keyword" } }} }
}

PUT /ems/emp/_bulk

{"index":{"_id":1}}
{"name":"小黑","age":23,"bir":"2012-12-12","content":"为开发团队选择一款优秀的MVC框架是件难难事,在众多可行的方案中决择需要很高的经验和水平","address":"北京"}
{"index":{"_id":2}}
{"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在心容器之上,核心容器定义了创建、配置和管理 bean 的方式。为了测试添加一个内容北京","address":"上海"}
{"index":{"_id":3}}
{"name":"张小五","age":8,"bir":"2012-12-12","content":"SpringCloud作为Java语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。SpringCloud的组件非常多,涉及微服务的方方面面,并在开源社区Spring 和Netflix、Pivotal 两大公司的推动下越来越完善","address":"无锡"}
{"index":{"_id":4}}
{"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目标是致力于全方位的简化Java开发。 这势必引出更多的解释,Spring是如何简化Java开发的?","address":"南京"}
{"index":{"_id":5}}
{"name":"梅超风","age":43,"bir":"2012-12-12","content":"Redis一个开源的使  用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API","address":"杭州"}
{"index":{"_id":6}}
{"name":"张无忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一个  基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口","address":"北京"}

from和size(分页查询)

formsize等同于MySQL中limit后的2个数值,借助这2个属性可以完成分页。

GET /ems/emp/_search

{"query":{"match_all":{}},"from":3,"size":3,"sort":[{"age":{"order": "desc"}}]
} 

在这里插入图片描述

在这里插入图片描述

sort(排序)

sort属性值是一个数组,表示可以设定多个字段的排序

{"sort":[{"字段1":{"order":"asc|desc"}},{"字段2":{"order":"asc|desc"}}]
} 

上述语法也可以简化如下:

{"sort":[{"字段1":"asc|desc"},{"字段2":"asc|desc"}]
}   

案例:
GET /ems/emp/_search

{"query":{"match_all":{}},"sort":[{"address":{"order":"desc"}},{"age":{"order": "asc"}}]
}  
{"query":{"match_all":{}},"sort":[{"address":"desc"},{"age":"asc"}]
} 

在这里插入图片描述
在这里插入图片描述

_source(查询指定字段)

_source是一个数组,指定要显示的字段。

{"_source":["字段名1","字段名2",...]
} 

案例:
GET /ems/emp/_search

{"query": {"match_all": {}},"_source":["name","age"]
}  

在这里插入图片描述
在这里插入图片描述

query(查询规则)

query用于设置查询规则,Elasticsearch中有多种查询规则

{"query":{"match_all":{},//匹配所有"match":{},//分词查询"term":{},//关键字查询"range":{},//范围查询"prefix":{},//前缀查询"wildcard":{},//通配符查询"ids":{},//多id查询"fuzzy":{},//模糊查询"bool":{},//bool查询"multi_match":{}//多字段查询}
}     

我们选几种常见的进行讲解

match(分词查询)

match 匹配查询,会对条件分词后查询

GET /ems/emp/_search

{"query":{"match":{"content": "Redis Java"}}
}   

在这里插入图片描述
在这里插入图片描述

term (关键字查询)

term 关键字: 用来使用关键词查询,不会对条件分词

GET /ems/emp/_search

{"query":{"term":{"content":{"value":"spring" //注意字母必须小写;如果出现大写字母,查询不到结果}}}
}

在这里插入图片描述
在这里插入图片描述

range(范围查询)

range 关键字: 用来指定查询指定范围内的文档

GET /ems/emp/_search

{"query":{"range":{"age":{"gte":40, // greater than equals"lt":80 // less than}}}
}

在这里插入图片描述
在这里插入图片描述

ids(多id查询)

GET /ems/emp/_search

{"query":{"ids":{"values":["1","2"]}}
}

在这里插入图片描述
在这里插入图片描述

bool(布尔查询)

bool查询:bool查询用于合并多个查询条件
bool查询中有must、should、must_not3个关键字
must:相当于java中的&&,所有条件必须同时满足
should:相当于java中||,任一条件满足即可
must_not:相当于java中的!,取反操作

  1. must示例:
    GET /ems/emp/_search
{"query":{"bool":{"must":[{ //查询地址以北作为前缀的"prefix":{ "address":{"value":"北"}}},{"range":{"age":{"gte":40}}}]}}
}

在这里插入图片描述
在这里插入图片描述

  1. should示例
    GET /ems/emp/_search
{"query":{"bool":{"should":[{"prefix":{"address":{"value":"北"}}},{"ids":{"values":["1","3","5"]}}]}}
}

在这里插入图片描述
在这里插入图片描述

  1. must_not示例
    GET /ems/emp/_search
{"query":{"bool":{"must_not":[{"prefix":{"address":{"value":"北"}}},{"term":{"content":{"value":"spring"}}}]}}
}

在这里插入图片描述
在这里插入图片描述

multi_match(多字段分词查询)

muli_match用于在多个字段中分词查询

GET /ems/emp/_search

{"query":{"multi_match":{"query":"张黑java","fields":["name","content"]}}
}

在这里插入图片描述
在这里插入图片描述

高亮查询

hightlight用于在查询关键字上添加样式,以达到高亮显示的效果。
GET /ems/emp/_search

{"query":{"multi_match":{"query":"张黑java","fields":["name","content"]}},"highlight":{"fields":{"content":{},"name":{}},"pre_tags":["<span style='color:red'>"],"post_tags":["</span>"]}
}

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

鸿蒙原生应用/元服务开发-Stage模型能力接口(一)

ohos.app.ability.Ability (Ability基类)一、说明 UIAbility和ExtensionAbility的基类&#xff0c;提供系统配置更新回调和系统内存调整回调。本模块首批接口从API version 9 开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口仅可在Stag…

flex布局的flex为1到底是什么

参考博客&#xff1a;flex:1什么意思_公孙元二的博客-CSDN博客 flex&#xff1a;1即为flex-grow&#xff1a;1&#xff0c;经常用作自适应布局&#xff0c;将父容器的display&#xff1a;flex&#xff0c;侧边栏大小固定后&#xff0c;将内容区flex&#xff1a;1&#xff0c;内…

华为数通---配置Smart Link负载分担案例

定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 目的 下游设备连接到上游设备&#xff0c;当使用单上行方式时&#x…

KUKA机器人如何自定义数值型变量?

KUKA机器人如何自定义数值型变量? 在KUKA机器人系统中如何自定义数值型变量来实现工件计数、计时等功能? 具体方法可参考以下内容: 如下图所示,找到SYSTEM—CONFIG.DAT文件,进入(需要管理员权限), 如下图所示,在第10行自定义一个int型的变量a, 如下图所示,自定义完成…

Ribbon组件的负载均衡原理

原因背景 spring cloud的底层负载均衡是采用Ribbon组件&#xff0c;我们将user-service服务注册到eureka-server中&#xff0c;那么当我们在另一个服务的代码层面请求远程调用API接口http://user-service/users/5时&#xff0c;程序代码如何解析远程调用的user-service服务名转…

Dockerfile介绍

1. DockerFile介绍 dockerfile是用来构建docker镜像的文件&#xff01;命令参数脚本&#xff01; 构建步骤&#xff1a; 1、编写一个dockerfile文件 2、docker build 构建成为一个镜像 3、docker run运行镜像 4、docker push发布镜像&#xff08;DockerHub、阿里云镜像仓库…

Django模板,Django中间件,ORM操作(pymysql + SQL语句),连接池,session和cookie, 缓存

day04 django进阶-知识点 今日概要&#xff1a; 模板中间件ORM操作&#xff08;pymysql SQL语句&#xff09;session和cookie缓存&#xff08;很多种方式&#xff09; 内容回顾 请求周期 路由系统 最基本路由关系动态路由&#xff08;含正则&#xff09;路由分发不同的app中…

《论文阅读》用于情绪回复生成的情绪正则化条件变分自动编码器 Affective Computing 2021

《论文阅读》用于情绪回复生成的情绪正则化条件变分自动编码器 前言简介模型结构实验结果总结前言 今天为大家带来的是《Emotion-Regularized Conditional Variational Autoencoder for Emotional Response Generation》 出版:IEEE Transactions on Affective Computing 时间…

ZKP Understanding Nova (2) Relaxed R1CS

Understanding Nova Kothapalli, Abhiram, Srinath Setty, and Ioanna Tzialla. “Nova: Recursive zero-knowledge arguments from folding schemes.” Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022. Nova: Paper Code 2. Unders…

openGauss学习笔记-147 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_dump

文章目录 openGauss学习笔记-147 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_dump147.1 背景信息147.2 注意事项147.3 语法147.4 参数说明147.4.1 通用参数&#xff1a;147.4.2 转储参数&#xff1a;147.4.3 连接参数&#xff1a; 147.5 说明147.6 示例 openGauss学习…

HTTP、HTTPS、SSL协议以及报文讲解

目录 HTTP/HTTPS介绍 HTTP/HTTPS基本信息 HTTP请求与应答报文 HTTP请求报文 HTTP响应报文 SSL协议 SSL单向认证 SSL双向认证 HTTP连接建立与传输步骤 HTTP访问全过程相关报文&#xff08;以访问www.download.cucdccom为例子&#xff09; DNS报文解析 TCP三次握手连…

【Flink系列六】Flink里面的状态一致性

状态一致性 有状态的流处理&#xff0c;内部每个算子任务都可以有自己的状态&#xff0c;对于流处理器内部来说&#xff0c;所谓的状态一致性&#xff0c;其实就是我们所说的计算结果要保证准确。一条数据不应该丢失&#xff0c;也不应该重复计算。再遇到有故障时可以恢复状态…

RabbitMQ 常见面试题

目录 1.前置知识1.1.什么是 MQ&#xff1f;它有什么作用&#xff1f;1.2.什么是消费者生产者模型&#xff1f;1.3.AMQP 是什么&#xff1f; 2.RabbitMQ 入门2.1.什么是 RabbitMQ&#xff1f;有什么特点&#xff1f;2.2.RabbitMQ 的核心概念有哪些&#xff1f;2.2.1.生产者 (Pro…

css 元素前后添加图标(::before 和 ::after 的妙用)

<template><div class"container"><div class"label">猜你喜欢</div></div> </template><style lang"scss" scoped> .label {display: flex;&::before,&::after {content: "";widt…

LLM之RAG实战(二):使用LlamaIndex + Metaphor实现知识工作自动化

最先进的大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT、GPT-4、Claude 2&#xff0c;具有令人难以置信的推理能力&#xff0c;可以解锁各种用例——从洞察力提取到问答&#xff0c;再到通用工作流自动化。然而&#xff0c;他们检索上下文相关信息的能力有限。…

[论文阅读]BEVFusion

BEVFusion BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework BEVFusion&#xff1a;简单而强大的激光雷达相机融合框架 论文网址&#xff1a;BEVFusion 论文代码&#xff1a;BEVFusion 简读论文 论文背景&#xff1a;激光雷达和摄像头是自动驾驶系统中常用的两…

UE Http笔记

c参考链接 UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客 虚幻引擎:UEC如何对JSON文件进行读写?-CSDN博客 UE4 HTTP使用 官方免费插件 VaRest 在代码插件创建的VaRest - 虚幻引擎商城 UE5在蓝图中使用Varest插件Get&#xff0c;Post两种常见请求方式…

webpack学习-3.管理输出

webpack学习-3.管理输出 1.简单练手2.设置 HtmlWebpackPlugin3.清理 /dist 文件夹4.manifest5.总结 1.简单练手 官网的第一个预先准备&#xff0c;是多入口的。 const path require(path);module.exports {entry: {index: ./src/index.js,print: ./src/print.js,},output: …

axios调接口传参特殊字符丢失的问题(encodeURI 和 encodeURIComponent)

1、axios调接口特殊字符丢失的问题 项目开发过程中遇到一个接口传参&#xff0c;参数带特殊字符&#xff0c;axios调接口特殊字符丢失的问题 例如接口&#xff1a; get/user/detail/{name} name是个参数直接调接口的时候拼到接口上&#xff0c;get/user/detail/test123#$%&am…

华为配置Smart Link负载分担示例

Smart Link基本概念 Smart Link通过两个端口相互配合工作来实现功能。这样的一对端口组成了一个Smart Link组。为了区别一个Smart Link组中的两个端口&#xff0c;我们将其中的一个叫做主端口&#xff0c;另一个叫做从端口。同时我们利用Flush报文、Smart Link实例和控制VLAN等…