ElasticSearch语法

news2024/11/17 3:08:12

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/_mapping

PUT /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
     */
    @Id
    private 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> {

   
}

    @Resource
    private PostEsDao postEsDao;

测试 

    @Test
    void 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  查询结果

查询结果

    @Test
    void 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.coloradmin.cn/o/1462815.html

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

相关文章

基于springboot+vue的教学资源库系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Java的编程之旅19——使用idea对面相对象编程项目的创建

在介绍面向对象编程之前先说一下我们在idea中如何创建项目文件 使用快捷键CtrlshiftaltS新建一个模块&#xff0c;点击“”&#xff0c;再点New Module 点击Next 我这里给Module起名叫OOP,就是面向对象编程的英文缩写&#xff0c;再点击下面的Finish 点Apply或OK均可 右键src…

嵌入式Qt 计算器核心算法_1

一.表达式分离算法分析 二.分离算法实现 QCalculatorDec.cpp #include "QCalculatorDec.h"#include <QDebug>QCalculatorDec::QCalculatorDec() {m_exp "";m_result "";QQueue<QString> r split("9.11 ( -3 - 1 ) * -5 &…

SpringCloud Ribbon负载均衡的策略总结及其配置

1. 轮询策略 2. 权重轮询策略 3. 随机策略 4. 最少并发数策略 5. 在选定的负载均衡策略基础上重试机制 6. 可用性敏感策略。 7. 区域敏感策略 —————————————————————— Ribbon负载均衡策略的配置&#xff1a; 在application.yml中配置如下&am…

LeetCode | 两数相加 C语言

Problem: 2. 两数相加 文章目录 思路解题方法Code一些感想 思路 主要是一一相加和逆序的方式存储 先说逆序储存&#xff0c;看下图 我们先声明出指针p和指针q&#xff0c;还有指针head&#xff08;主要用于return上而已&#xff09;&#xff0c;然后进行一系列操作&#xff0c…

Disentangled Transfer Learning for Visual Recognition

DTL: Disentangled Transfer Learning for Visual Recognition 论文链接&#xff1a;https://arxiv.org/pdf/2312.07856.pdf源码链接&#xff1a;https://github.com/heekhero/DTL 简介 大规模预训练加微调的框架已经在各个领域推广。但是由于GPU内存或时间预算的原因&#…

Sora:打开视频创作新纪元的魔法钥匙

随着人工智能技术的飞速发展&#xff0c;AI视频模型已成为科技领域的新热点。而在这个浪潮中&#xff0c;OpenAI推出的首个AI视频模型Sora&#xff0c;以其卓越的性能和前瞻性的技术&#xff0c;引领着AI视频领域的创新发展。让我们将一起探讨Sora的技术特点、应用场景以及对未…

ctfshow web入门 web141-145

1.web141 ^\w$表示在开头和末尾匹配字母数字_&#xff0c;传入的v3值不能有字母数字_&#xff0c;即无字母的命令执行 php中1-phpinfo()是可以执行的&#xff0c;加减乘除都可以实现 这里或&#xff0c;异或&#xff0c;取反等运算都可以 这里采用羽师傅的异或脚本生成paylo…

代码随想录第二十三天 回溯算法 77.组合 216.组合总和 17.电话号码的字母组合

回溯算法 LeetCode 77 组合 题目描述 思路 递归函数的返回值以及参数 在这里要定义两个全局变量&#xff0c;一个用来存放符合条件单一结果&#xff0c;一个用来存放符合条件结果的集合。 代码如下&#xff1a; vector<vector<int>> result; // 存放符合条件…

如何使用Docker本地部署Jupyter+Notebook容器并结合内网穿透实现远程访问

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

思科Cisco下输入问号“?”命令help

Cisco CLI &#xff08;Command-Line Interface&#xff09;命令下输入问号“&#xff1f;” 一、在Cisco CLI下&#xff0c;“&#xff1f;”被认为是 – help的帮助命令&#xff0c;当在默认情况下输入“&#xff1f;”&#xff0c;系统会自动识别为 help 命令。 二、那么&a…

【Java面试系列】Nginx

目录 为什么要用Nginx&#xff1f;为什么Nginx性能这么高&#xff1f;Nginx 是如何实现高并发的&#xff1f; Nginx怎么处理请求的&#xff1f;Nginx的工作流程 给 favicon.ico 和 robots.txt 设置过期时间; 这里为 favicon.ico 为 99 天,robots.txt 为 7 天并不记录 404 错误日…

牛B了,GitHub用户免费领空投: TOP 5k 项目的贡献者可领取价值 $200空投。

StarkNet 公链项目为了激励开发者参与其平台建设&#xff0c;启动了空投活动。 如果曾向 GitHub 上获得较多 Star 的项目提交过 PR &#xff0c;就有资格领取 111.1 STRK 的空投奖励。 只需要使用 OAuth 2.0 登录&#xff0c;就可以直接领取。 领取规则 截止到 2023 年 11 月 …

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

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

客户端web开发工具

文章目录 安全网络Linter-->捕获代码错误-->eslint源代码控制-->Git代码格式化-->Prettier打包工具--Parcel--Webpack 转换--Babel开发后阶段测试工具配置工具其他 node&#xff0c;npm、yarnnode.js包管理器npmyarn https://developer.mozilla.org/zh-CN/docs/Lea…

http和https的区别(简述)

HTTP&#xff08;HyperText Transfer Protocol&#xff09;和HTTPS&#xff08;HTTP Secure&#xff09;都是用于在客户端和服务器之间传输数据的协议&#xff0c;但它们在安全性方面有重要的区别。 1.HTTP: 概述&#xff1a; HTTP是一种用于传输超文本的协议&#xff08;超文…

洗选中心智能化运维工是做什么的?智能化运维工程师是干什么的

洗选中心智能化运维工程师的职责和工作内容&#xff1f;同时&#xff0c;描述智能化运维工程师在信息技术行业中的具体角色和他们的主要任务。  洗选中心智能运维工程师的职责和工作内容主要包括&#xff1a;  设备监控管理&#xff1a;重点对洗涤中心机器进行实时监控管理…

新书速览|细说PyTorch深度学习:理论、算法、模型与编程实现

超详细的PyTorch深度学习入门书&#xff0c;100余个编程示例6大热点案例&#xff0c;大咖带路&#xff0c;边学边实践。 本书特点&#xff1a; 1. 专家编撰&#xff1a;由资深专家精心编撰&#xff0c;通俗易懂&#xff0c;娓娓道来 2&#xff0e;范例丰富&#xff1a;100余个…

ChatGPT在数据分析OKR计划中的应用

ChatGPT在数据分析OKR计划中的应用 ​ 现在大多数公司引入了OKR&#xff08;objective & key result&#xff09;计划&#xff0c;数据分析师也需要定期制定和检查自己的OKR计划。我们不仅可以利用ChatGPT辅助制定OKR计划&#xff0c;也可以让其对OKR计划内容进行调整、优…

C++笔记:OOP三大特性之多态

前言 本博客中的代码和解释都是在VS2019下的x86程序中进行的&#xff0c;涉及的指针都是 4 字节&#xff0c;如果要其他平台下测试&#xff0c;部分代码需要改动。比如&#xff1a;如果是x64程序&#xff0c;则需要考虑指针是8bytes问题等等。 文章目录 前言一、多态的概念二、…