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/_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
    }
  }
}

这期就到这里 , 下期见 !

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.2.鸿蒙LiteOS-M los_dispatch

目录 一、cortex-m4 los_dispatch.S代码分析坚持就有收获 一、cortex-m4 los_dispatch.S代码分析 .syntax unified #.syntax [unified | divided], 指定arm 汇编语法规则 .arch armv7e-m #指定平台, 与命令行参数-march同样的作用 .fpu fpv4-sp-d16 #指定浮点运算…

第九篇【传奇开心果系列】python文本和语音相互转换库技术点案例示例:SpeechRecognitio库开发会议记录和转录工具经典案例

传奇开心果博文系列 系列博文目录python文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、SpeechRecognition库多种语音识别引擎支持示例代码四、SpeechRecognition库实时语音转录示例代码五、SpeechRecognitio库转录文本中提取关键词…

GPT Pilot - 编写 95% 代码的开发工具!

在这篇博客介绍了GPT-pilot的研发细节&#xff0c;原作者将探讨GPT Pilot的技术内核 —— 一款基于GPT-4编写的开发工具&#xff0c;可以生成生产使用代码的应用。 你有没有想过&#xff0c;95%的应用代码&#xff0c;可以由AI编写&#xff0c;就像《钢铁侠》里的贾维斯一样&a…

DAY30--learning English

一、积累 1.budget 2.fabulous 3.strait 4.jut 5.grater 6.fillet 7.fin 8.decay 9.cartilage 10.gill 11.convex 12.concave 13.tender 14.trim 15.workload 16.knuckle 17.crevice 18.skew 19.membrane 20.delicate 二、练习 1.牛津原译 Budget /ˈbʌdʒɪt/ 1.[ CU]the…

一流的财务:搞数据!!!(干货)

“三流财务给数据&#xff0c;二流财务给分析报告&#xff0c;一流财务给....&#xff08;解决方案&#xff09;“这些文章应该很多人都看到过&#xff0c;这个口号粗看好像很有道理&#xff0c;但笔者并不认同&#xff0c;因为大家都忽略了一个重要的概念&#xff1a;数据&…

CrossOver2024国产版虚拟机软件有哪些功能呢?

除了办公应用场景&#xff0c;CrossOver虚拟机软件还可以在以下场景中使用&#xff1a; 设计与开发&#xff1a;对于设计师和开发人员来说&#xff0c;某些特定的Windows设计和开发工具可能在Mac或Linux上没有完美的替代品。此时&#xff0c;他们可以使用CrossOver来运行这些工…

SQL 中如何实现多表关联查询?

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; 在SQL中&#xff0c;多表关联查询是通过使用JOIN操作来实现的&#xff0c;它允许你从两个或多个表中根据相关列的值来检索数据。以下是几种常见的JOIN类型&#xff1a; …

wpf 3d 后台加载模型和调整参数

下载了一个代码&#xff0c;加载obj模型&#xff1b;它的参数在xaml里&#xff0c;模型加载出来刚好&#xff1b; 然后加载另一个obj模型&#xff1b;加载出来之后大&#xff0c;偏到很高和左的位置&#xff1b; 它之前的摄像机位置&#xff0c; Position"9.94759830064…

Apache celeborn 安装及使用教程

1.下载安装包 https://celeborn.apache.org/download/ 测0.4.0时出现https://github.com/apache/incubator-celeborn/issues/835 2.解压 tar -xzvf apache-celeborn-0.3.2-incubating-bin.tgz 3.修改配置文件 cp celeborn-env.sh.template celeborn-env.shcp log4j2.xml.…

Canvas学习笔记02:canvas的路径扫盲,附代码案例

hello&#xff0c;我是贝格前端工场&#xff0c;最近在学习canvas&#xff0c;分享一些canvas的一些知识点笔记&#xff0c;本期分享canvas的路径知识&#xff0c;欢迎老铁们一同学习&#xff0c;欢迎关注&#xff0c;如有前端项目可以私信贝格。 一、什么是canvas路径 Canvas…

滑动窗口刷题(三)

1. 找到字符串中所有字母异位词 1.题目解析 比较易懂&#xff0c;不做解析。 2.算法思路 哈希表滑动窗口有效字符个数优化 创建两个哈希表&#xff0c;将p字符串存入哈希表2。 定义cnt存放有效字符个数。 进窗口&#xff1a;存入哈希表1&#xff0c;如果该元素在哈希1中的…

嵌入式中常见语言对内存管理基本方法

大家好&#xff0c;今天给大家分享一下&#xff0c;从语言角度来讲:对比常见的几种语言对内存的管理方法​。 (1&#xff09;汇编语言:根本没有任何内存管理&#xff0c;内存管理全靠程序员自己&#xff0c;汇编中操作内存时直接使用内存地址&#xff08;譬如0xd0020010 )&…

前端工程化面试题 | 17.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ElasticSearch索引数据备份与恢复

索引数据备份 在磁盘创建备份目录并授权 # 创建备份目录 /home/esbackup # 授权 chmod 777 /home/esbackup修改配置文件elasticsearch.yml echo path.repo: ["/home/esbackup"] >> /etc/elasticsearch/elasticsearch.yml重启elasticsearch(我是docker创建的…

python:读 Freeplane.mm文件,使用 xml.etree 生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 强大的节点功能&#xff0c;不仅仅节点的种类很多&#xf…

提升代码能力:程序员的进阶之路

提升代码能力&#xff1a;程序员的进阶之路 在当今日益发展的技术领域&#xff0c;程序员的代码能力对于个人职业发展至关重要。优秀的代码能力不仅能提高开发效率&#xff0c;还能产生高质量的软件和解决方案。然而&#xff0c;提升代码能力是一个不断学习和成长的过程。本文将…

人工智能何时会拥有自由意志?

一、自由意志的来源 人类的自由意志是一个复杂而深奥的概念&#xff0c;它涉及到哲学、心理学、神经科学等多个学科领域。目前并没有一个统一且被广泛接受的答案来完全解释自由意志如何形成&#xff0c;但可以从多个角度探讨其可能性和相关理论&#xff1a; 1. **哲学视角**&…

python项目的容器化部署

python项目的容器化部署 参考链接编辑Dockerfile文件构建镜像打包镜像加载镜像创建并启动容器 参考链接 链接1 链接2 编辑Dockerfile文件 下方代码是Dockerfile文件的内容&#xff1a; FROM continuumio/miniconda3 WORKDIR .COPY table_handle/ ./table_handle/COPY requi…

零基础学编程,编程简单学,中文编程工具下载及工具箱进度条构件的用法

一、前言 今天给大家分享的中文编程开发语言工具 进度条构件的用法。 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编程工具免费版下载及实例源码下载。 进度条 进度…

注入工具SQLMAP教程:Tamper编写;指纹修改;高权限操作;目录架构等

注入工具SQLMAP教程&#xff1a;Tamper编写;指纹修改;高权限操作;目录架构 #知识点&#xff1a; 1、SQLMAP-常规猜解&字典配置 2、SQLMAP-权限操作&文件命令 3、SQLMAP-Tamper&使用&开发 4、SQLMAP-调试指纹&风险等级 #参考文章&#xff1a; https://w…