ElasticSearch语法

Elasticsearch 概念

入门学习:

  • Index索引=>MySQL 里的表(table)
  • 建表、增删改查(查询需要花费的学习时间最多)
  • 用客户端去调用 ElasticSearch(3 种)
  • 语法:SQL、代码的方法(4 种语法)

ES 相比于 MySQL,能够自动帮我们做分词,能够非常高效、灵活地查询内容。

索引(倒排索引)

正向索引:理解为书籍的目录,可以快速帮你找到对应的内容(怎么根据页码找到文章)

倒排索引:怎么根据内容找到文章

文章 A: 你好,我是 rapper

文章 B: 苏麟暴打小杨科

切词 :

id
你好文章 A

文章 A
rapper文章 A
苏麟文章 B
暴打文章 B
杨科文章 B

用户搜索 : 苏麟杨科

ES切词 : 苏麟 , 杨科

然后去倒排索引表找对应的文章

ES 的几种调用方式

1) restful api 调用(http 请求)

GET请求 : localhost:9200

curl 可以模拟发送请求: curl -XGET"localhost:9200/?pretty

ES 的启动端口

1.9200:给外部用户(给客户端调用)的端口

2.9300:给 ES 集群内部通信的(外部调用不了的)

2) kibana devtools

自由地对 ES 进行操作(本质也是 restful api)
devtools 不建议生产环境使用

3)客户端调用

java 客户端、go 客户端等。

参考文档 : Getting started | Elasticsearch Java API Client [7.17] | Elastic

ES 的语法

DSL

json 格式,好理解;和 http 请求最兼容,应用最广

建表,插入数据  (文档就是MySQL里的表,映射就是MySQL里的字段)

post 就相当于表名  , title 和 content 就相当于字段

POST post/_doc
{"title":"苏麟","content":"苏麟暴打小杨科"
}

successful 就代表存入成功了 

查询

DSL (不要背) : Query DSL | Elasticsearch Guide [7.17] | Elastic

查询全部 

GET post/_search
{"query": {"match_all": {}}
}

根据 id 查询 

GET post/_doc/UBHryo0B5ErW0HhSBc0q

修改

根据 id 修改


POST post/_doc/UBHryo0B5ErW0HhSBc0q
{"title":"杨科","content":"杨科委委屈屈!"
}

删除

根据文档删除

DELETE post


EQL

专门查询 ECS 文档(标准指标文档)的数据的语法,更加规范,但只适用于特定场景(比如事件流)

文档 : EQL search | Elasticsearch Guide [7.17] | Elastic

建表,插入

POST post_my/_doc
{"title": "苏麟爱看美女","@timestamp": "2099-05-06T16:21:15.000Z","event": {"original": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"}
}

查询

GET post_my/_search
{"query": {"match_all": { }},"sort": [{"@timestamp": "desc"}]
}

SQL

文档 : Getting Started with SQL | Elasticsearch Guide [7.17] | Elastic

查询

POST /_sql?format=txt
{"query": "SELECT * FROM post "
}

Painless Scripting language

编程式取值,更灵活,但是学习成本高

Mapping

文档 : Explicit mapping | Elasticsearch Guide [7.17] | Elastic

可以理解为数据库的表结构,有哪些字段、字段类型,

ES 支持动态 mapping,表结构可以动态改变,而不像 MySQL 一样必须手动建表,没有的字段就不能插入。

GET user/_mappingPUT /user
{"mappings": {"properties": {"age":    { "type": "integer" },  "email":  { "type": "keyword"  }, "name":   { "type": "text"  }     }}
}

分词器

指定了分词的规则。

内置分词器 : Built-in analyzer reference | Elasticsearch Guide [7.17] | Elastic

示例 : 

空格分词器: whitespace,结果The、quick、brown、fox.

POST _analyze
{"analyzer": "whitespace","text":     "The quick brown fox."
}

标准分词规则,结果:is、this、deja、vu

POST _analyze
{"tokenizer": "standard","filter":  [ "lowercase", "asciifolding" ],"text":      "Is this déja vu?"
}

关键词分词器:就是不分词,整句话当作专业术语

GET _analyze 
{"analyzer": "keyword", "text":     "Is this sl?"
}

打分机制

比如有3条内容:

1.苏麟是gay

2.苏麟暴打小杨科

3.小杨科

用户搜索:

1.杨科,第三条分数最高,因为第三条匹配了关键词,而且更短(匹配比例更大)

2.苏麟  => 苏麟是gay => 苏麟暴打小杨科 , 排序结果 1  2

参考文章 : Controlling Relevance | Elasticsearch: The Definitive Guide [master] | Elastic

Java 操作 ES

3 种方式:

1) ES 官方的 Java API

文章 : Introduction | Elasticsearch Java API Client [7.17] | Elastic

快速开始 : Connecting | Elasticsearch Java API Client [7.17] | Elastic

2) ES 以前的官方 Java APl,HighLevelRestclient(已废弃,不建议用)

3) Spring Data Elasticsearch(推荐)

spring-data 系列:spring 提供的操作数据的框架

spring-data-redis:操作 redis 的-套方法

spring-data-mongodb:操作 mongodb 的一套方法

spring-data-elasticsearch:操作 elasticsearch 的一套方法

...

建表结构:

aliases 起别名

PUT post_v1
{"aliases": {"post": {}},"mappings": {"properties": {"title": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"content": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"tags": {"type": "keyword"},"thumbNum": {"type": "long"},"favourNum": {"type": "long"},"userId": {"type": "keyword"},"createTime": {"type": "date"},"updateTime": {"type": "date"},"isDelete": {"type": "keyword"}}}
}

增删改查

第一种方式: ElasticsearchRepository<xxxx, Long>,默认提供了简单的增删改查,多用于可预期的、相对没那么复杂的查询、自定义查询,返回结果相对简单直接。

有一些现成的方法可以使用

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.data.repository;import java.util.Optional;@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S entity);<S extends T> Iterable<S> saveAll(Iterable<S> entities);Optional<T> findById(ID id);boolean existsById(ID id);Iterable<T> findAll();Iterable<T> findAllById(Iterable<ID> ids);long count();void deleteById(ID id);void delete(T entity);void deleteAllById(Iterable<? extends ID> ids);void deleteAll(Iterable<? extends T> entities);void deleteAll();
}

第二种方式: Spring 默认给我们提供的操作 es 的客户端对象 ElasticsearchRestTemplate,也提供了增删改查它的增删改查更灵活,适用于更复杂的操作,返回结果更完整,但需要自己解析。

准备工作

package com.yupi.springbootinit.model.dto.post;import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import com.yupi.springbootinit.model.entity.Post;
import lombok.Data;import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.io.Serializable;
import java.util.Date;
import java.util.List;/*** 帖子 ES 包装类***/
@Document(indexName = "post")
@Data
public class PostEsDTO implements Serializable {private static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";/*** id*/@Idprivate Long id;/*** 标题*/private String title;/*** 内容*/private String content;/*** 标签列表*/private List<String> tags;/*** 创建用户 id*/private Long userId;/*** 创建时间*/@Field(index = false, store = true, type = FieldType.Date, format = {}, pattern = DATE_TIME_PATTERN)private Date createTime;/*** 更新时间*/@Field(index = false, store = true, type = FieldType.Date, format = {}, pattern = DATE_TIME_PATTERN)private Date updateTime;/*** 是否删除*/private Integer isDelete;private static final long serialVersionUID = 1L;/*** 对象转包装类** @param post* @return*/public static PostEsDTO objToDto(Post post) {if (post == null) {return null;}PostEsDTO postEsDTO = new PostEsDTO();BeanUtils.copyProperties(post, postEsDTO);String tagsStr = post.getTags();if (StringUtils.isNotBlank(tagsStr)) {postEsDTO.setTags(JSONUtil.toList(tagsStr, String.class));}return postEsDTO;}/*** 包装类转对象** @param postEsDTO* @return*/public static Post dtoToObj(PostEsDTO postEsDTO) {if (postEsDTO == null) {return null;}Post post = new Post();BeanUtils.copyProperties(postEsDTO, post);List<String> tagList = postEsDTO.getTags();if (CollUtil.isNotEmpty(tagList)) {post.setTags(JSONUtil.toJsonStr(tagList));}return post;}
}
public interface PostEsDao extends ElasticsearchRepository<PostEsDTO, Long> {}
@Resourceprivate PostEsDao postEsDao;

测试 

    @Testvoid testAdd() {PostEsDTO postEsDTO = new PostEsDTO();postEsDTO.setId(1L);postEsDTO.setTitle("苏麟");postEsDTO.setContent("风雨交加的夜晚,苏麟暴打小杨科,小杨科奄奄一息");postEsDTO.setTags(Arrays.asList("苏麟", "杨科","暴打"));postEsDTO.setUserId(1L);postEsDTO.setCreateTime(new Date());postEsDTO.setUpdateTime(new Date());postEsDTO.setIsDelete(0);postEsDao.save(postEsDTO);System.out.println(postEsDTO.getId());}

DSL  查询结果

查询结果

    @Testvoid testFindById() {Optional<PostEsDTO> postEsDTO = postEsDao.findById(1L);System.out.println(postEsDTO);}

DSL 查询转换 Java 代码查询

DSL 查询 

文档 : Query and filter context | Elasticsearch Guide [7.17] | Elastic

文档 : Boolean query | Elasticsearch Guide [7.17] | Elastic

GET post/_search
{"query": { "bool": { //组合条件"must": [ //必须满足{ "match": { "title":   "苏麟"        }}, //match 模糊查询{ "match": { "content": "苏麟" }}],"filter": [ //过滤{ "term":  { "status": "published" }}, //term 精确查询{ "range": { "publish_date": { "gte": "2015-01-01" }}} //范围查询]}}
}
GET post/_search
{"query": { "bool": { "must": [{ "match": { "title":   "苏麟"        }},{ "match": { "content": "苏麟" }}]}}
}

wildcard 模糊查询
regexp 正则匹配查询

查询结果中,score 代表匹配分数
建议先测试 DSL、再翻译成 Java

POST _search
{"query": {"bool" : {"must" : {"term" : { "user.id" : "kimchy" }},"filter": {"term" : { "tags" : "production" }},"must_not" : {"range" : {"age" : { "gte" : 10, "lte" : 20 }}},"should" : [{ "term" : { "tags" : "env1" } },{ "term" : { "tags" : "deployed" } }],"minimum_should_match" : 1,"boost" : 1.0}}
}

这期就到这里 , 下期见 !

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

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

相关文章

【快速上手QT】04-定时器Timer

先来个小示例 我们先简单的来触发一下定时器。 #include "Zhetu.h"#include <qdebug.h>void Zhetu::timerEvent(QTimerEvent* event) { //定时器触发函数qDebug() << "Hello world"; }Zhetu::Zhetu(QWidget *parent): QMainWindow(parent){t…

C#,数值计算,矩阵的乔莱斯基分解(Cholesky decomposition)算法与源代码

一、安德烈路易斯乔尔斯基 安德烈路易斯乔尔斯基出生于法国波尔多以北的查伦特斯海域的蒙古扬。他在波尔多参加了Lyce e&#xff0c;并于1892年11月14日获得学士学位的第一部分&#xff0c;于1893年7月24日获得第二部分。1895年10月15日&#xff0c;乔尔斯基进入莱科尔理工学院…

PhotoSweeper X mac版 v4.8.5 相似重复照片清理工具 兼容 M1/M2

PhotoSweeper X for Mac是一款Mac重复照片/相似照片清理工具&#xff01;PhotoSweeper可以帮你进行&#xff1a;重复相似照片/数码相片查找、对比和删除&#xff0c;轻松清理Mac上的重复图片&#xff0c;非常实用。 应用介绍 PhotoSweeper X for Mac是一款Mac重复照片/相似照片…

实战打靶集锦-025-HackInOS

文章目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查5. 提权5.1 枚举系统信息5.2 探索一下passwd5.3 枚举可执行文件5.4 查看capabilities位5.5 目录探索5.6 枚举定时任务5.7 Linpeas提权 靶机地址&#xff1a;https://download.vulnhub.com/hackinos/HackInOS.ova 1. 主机…

【图片公式识别】图片公式转Word与LaTeX文档:智能识别与转换

前言 嘿&#xff0c;大家好呀&#xff01;&#x1f44b; 谁都知道&#xff0c;写 Word 文档里的公式可不是一件简单的事情&#xff01;你辛辛苦苦在键盘上敲出的数学公式&#xff0c;结果随着 Word 版本的更新&#xff0c;竟然变成了一张图片&#xff01;&#x1f624; 这简直就…

板块一 Servlet编程:第八节 文件上传下载操作 来自【汤米尼克的JavaEE全套教程专栏】

板块一 Servlet编程&#xff1a;第八节 文件的上传下载操作 一、文件上传&#xff08;1&#xff09;前端内容&#xff08;2&#xff09;后端内容 二、文件下载&#xff08;1&#xff09;前端的超链接下载&#xff08;2&#xff09;后端下载 在之前的内容中我们终于结束了Servle…

qtday2作业

思维导图 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;…

Linux搭建FISCO BCOS的第一个区块链网络

一、前言 FISCO BCOS是由金融区块链合作联盟&#xff08;深圳&#xff09;与微众银行共同发起的开源区块链项目&#xff0c;支持多链多账本&#xff0c;满足金融行业复杂业务需求。本文将介绍如何在Ubuntu操作系统上使用Linux命令搭建FISCO BCOS的第一个区块链网络。 目录 一…

K8S部署Java项目(Springboot项目)pod状态:CrashLoopBackOff

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

昇腾ACL应用开发之模型转换ATC

一.前提条件 在前面的章节中我们已经安装了包含模型转换的套件包CANN-TOOLKIT&#xff0c;默认的安装路径会在/usr/local/Ascend里面&#xff0c;我们将该套件所需要的东西加入到环境变量中以便我们调用&#xff1a; 将source /usr/local/Ascend/ascend-toolkit/set_env.sh加入…

人为物累,心为形役

一、人是什么 你是你&#xff0c;他是他&#xff0c;我是我&#xff0c;有什么区别吗&#xff0c;直到自我发现我与你不同时&#xff0c;不同是什么&#xff0c;身体结构&#xff1f;人生经历&#xff1f;所拥有的一切&#xff1f;暂时搁置这些的话&#xff0c;抽离我们的意识…

[ai笔记11] 论ai韭菜的自我修养

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵学习ai以及观点分享的第11篇内容&#xff01; 上班之后时间确实少了许多&#xff0c;但是最近也没闲着&#xff0c;关于ai的学习一直在探索两个部分&#xff0c;一个是看那本有名的书《这就是ChatGPT》&#xff0c;另外一个则…

Gmail邮箱群发邮件的技巧?邮箱怎么绑定?

Gmail邮箱注册教程指南&#xff1f;如何注册新的Gmail邮箱帐户&#xff1f; Gmail邮箱作为谷歌推出的邮件服务&#xff0c;以其高效、稳定和便捷的特性受到广大用户的喜爱。然而&#xff0c;如何在Gmail中进行有效的群发邮件&#xff0c;接下来&#xff0c;蜂邮将给大家介绍一…

odoo16-API(Controller)带有验证访问的接口

odoo16-API&#xff08;Controller&#xff09;带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…

【深入理解设计模式】 工厂设计模式

工厂设计模式 工厂设计模式是一种创建型设计模式&#xff0c;它提供了一种在不指定具体类的情况下创建对象的接口。在工厂设计模式中&#xff0c;我们定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 工厂设计模式的目…

part2 思维导图(微分部分)

1. 导数和微分 2. 一元微分学 2.1 四则运算 2.2 口诀 2.3 导数计算 2.3.1 计算1 2.3.1 计算2

win32汇编定时器继续学习2

前面学习了win32汇编定时器&#xff0c;还非常不熟悉&#xff0c;继续熟悉&#xff0c;稍微增加一点功能&#xff1b; .386.model flat,stdcalloption casemap:noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32…

2024生物发酵展创新盛会-兰格恒流泵

​ 参展企业介绍 兰格恒流泵有限公司成立于1997年&#xff0c;是英国豪迈国际有限公司&#xff08;Halma&#xff09;的全资子公司。我们始终坚持以客户需求为导向&#xff0c;提供安全、高精度及高品质的流体传输设备和解决方案。兰格产品系列超…

前端架构: 脚手架之Chalk和Chalk-CLI使用教程

Chalk Chalk 是粉笔的意思, 它想表达的是&#xff0c;给我们的命令行中的文本添加颜色类似彩色粉笔的功能 在官方文档当中&#xff0c;它的 Highlights 核心特性 Expressive API Highly performant No dependencies Ability to nest styles 256/Truecolor color support Auto-…