elasticsearch简单入门语法

news2025/1/2 3:54:06

基本操作

创建不同的分词器

ik_smart: 极简分词 ; ik_max_word: 最细力再度分词

基本的rest命令

methodurl地址描述
PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)
POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档
DELETElocalhost:9200/索引名称/类型名称/文档id删除文档
GETlocalhost:9200/索引名称/类型名称/文档id查询文档通过文档id
POSTlocalhost:9200/索引名称/类型名称/_search查询所有数据

索引基本操作

查询所有索引

Elasticsearch 7.x 版本

# 返回一个仅包含索引名称的 JSON 数组  

GET /_cat/indices?format=json&h=index

扩展:获取ES的其他信息

GET _cat/health      # 查看健康值  

GET _cat/indices?v  #查看所有东西的版本信息

新增索引

 # ElasticSearch的7.x.x版本
 PUT /索引名/类型名/文档id
 {
 请求体
 }

 # 创建索引
 

 PUT test1
 {
 "mappings": {
 "properties": {
  "name": {
    "type": "text"
  },
  "age":{
    "type": "integer"
  }
 }
 }
 }
 # 创建加索引时同时添加数据,es会自动给属性设置type
 # ElasticSearch的8.x.x版本,类型已经弃用,默认写_doc。
 PUT /索引名/_doc/文档id
 {
 请求体
 }
 ​
 PUT test1/_doc/1
 {
 "name":"小明",
 "age":23
 } # ElasticSearch的8.x.x版本,类型已经弃用,默认写_doc。
 PUT /索引名/_doc/文档id
 {
 请求体
 }
 CreateIndexRequest request = new CreateIndexRequest(INDEX);
 CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);

查看索引

name需要指定类型

官网类型文档地址:Keyword type family | Elasticsearch Guide [8.9] | Elastic

  • 字符串类型 text、keyword

  • 数值类型 long,integer,short,byte,double,float,half float,scaled float

  • 日期类型 date

  • te布尔值类型 boolean·

  • 二进制类型 binary

  • 等等……

设置字段类型

修改索引

索引是不可修改的。一旦创建了索引,您不能直接修改其结构或字段的映射。如果要修改索引的结构,您需要重新创建索引并重新索引数据。

 POST _reindex
 {
 "source": {
  "index": "your_old_index"
 },
 "dest": {
  "index": "new_index"
 }
 }

新索引和旧索引的字段不一定需要完全一致。在重新创建索引和重新索引数据时,可以对字段进行修改、删除或添加新的字段。

如果字段在新索引中已经存在,则该字段的映射将被保留。如果字段在新索引中不存在,则会根据重新索引的数据动态创建字段的映射。

例如,假设旧索引中有一个 "field1" 字段,而新索引中没有。在重新索引数据时,如果数据中存在 "field1" 字段,Elasticsearch 将自动创建该字段的映射并将其添加到新索引中。

同样地,如果旧索引中存在一个 "field2" 字段,而新索引中也有一个名为 "field2" 的字段,那么在重新索引数据时,新索引中的 "field2" 字段的映射将保留不变。

需要注意的是,如果字段在新索引和旧索引中具有不兼容的类型或映射定义,可能会导致数据转换或丢失。因此,在进行索引结构修改时,请确保对数据和字段映射的变化有充分的了解和计划。

删除索引

关于文档的基本操作

基本操作

添加数据

PUT /index/_doc/1
{
  "name": "狂神说",
  "age": 3,
  "desc": "工资2500",
  "tags": ["直男","温暖","技术宅"]
}
PUT /index/_doc/2
{
  "name": "张三",
  "age": 30,
  "desc": "没有工资",
  "tags": ["渣男","旅游","交友"]
}

查询数据

# 查询索引下,对应文档ID的数据
GET /index/_doc/1
GET /index/_doc/2

更新 PUT(不推荐)

PUT 修改数据,需要全属性字段都存在,否则会丢失缺失的属性字段

# 修改数据
put index/_doc/1
{
  "name": "杨光1",
  "age": 3,
  "desc": "工资2500",
  "tags": ["直男","温暖","技术宅"]
}
# PUT 修改时,会更新该ID下的所有字段,如果缺失字段,则会删除原有字段
put index/_doc/1
{
  "name": "杨光1",
  "age": 3,
  "desc": "工资2500"
}

更新 POST(推荐)

# POST 更新,会修改该文档ID下对应属性的值
POST index/_update/1
{
  "doc": {
    "name":"杨光3"
  }
}
 
# POST 更新,会修改该文档ID下对应属性的值,不推荐这样写,ES8执行不支持这种语法
POST index/_doc/1/_update
{
  "doc": {
    "name":"杨光4"
  }
}

 

条件查询

PUT /index/_doc/1
{
  "name": "杨光",
  "age": 3,
  "desc": "工资2500",
  "tags": ["直男","温暖","技术宅"]
}

PUT /index/_doc/2
{
  "name": "张三",
  "age": 30,
  "desc": "没有工资",
  "tags": ["渣男","旅游","交友"]
}


# 根据name查询
GET index/_search?q=name:张三

PUT index
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword"
      },
      "xm":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "age":{
        "type": "integer"
      },
      "desc":{
        "type": "text"
      },
      "tags":{
        "type": "text"
      }
    }
  }
}
# 测试数据
PUT /index/_doc/1
{
  "name": "杨光",
  "xm": "杨光",
  "age": 3,
  "desc": "工资2500",
  "tags": ["直男","温暖","技术宅"]
}

PUT /index/_doc/2
{
  "name": "张三",
  "xm": "张三",
  "age": 30,
  "desc": "没有工资",
  "tags": ["渣男","旅游","交友"]
}

PUT /index/_doc/3
{
  "name": "李三",
  "xm": "李三",
  "age": 23,
  "desc": "工资5000",
  "tags": ["健身","旅游","购物"]
}

PUT /index/_doc/4
{
  "name": "张三丰",
  "xm": "张三丰",
  "age": 10,
  "desc": "工资5000",
  "tags": ["健身","旅游","购物"]
}

PUT /index/_doc/5
{
  "name": "张",
  "xm": "张",
  "age": 10,
  "desc": "工资5000",
  "tags": ["健身","旅游","购物"]
}

PUT /index/_doc/6
{
  "name": "三",
  "xm": "三",
  "age": 10,
  "desc": "工资5000",
  "tags": ["健身","旅游","购物"]
}

match和term

Match查询和Term查询是Elasticsearch中常用的查询类型,它们有以下区别:

  1. 匹配方式:

  • Term查询:对查询条件不进行分词,直接按照完全匹配的方式进行查询。

  • Match查询:对查询条件进行分词,然后对分词后的词项进行匹配。

  1. 查询字段类型:

  • Term查询:适用于精确匹配的字段,如关键字(keyword)类型或未分词的文本类型(如"张三",不会被分词)。

  • Match查询:适用于全文本字段,如全文本(text)类型或已分词的文本类型(如"张三 张三",会被分词成两个词项"张三")。

  1. 匹配精度:

  • Term查询:精确匹配,只有完全匹配的词项才会被返回。

  • Match查询:默认为词项级别的匹配,可以根据分析器的分词规则进行模糊匹配。

  1. 执行效率:

  • Term查询:由于不进行分词,查询速度较快。

  • Match查询:需要对查询条件进行分词,可能会影响查询性能。

根据具体的查询需求,选择合适的查询类型可以提高查询的准确性和效率。如果需要精确匹配的查询,且不需要分词,可以选择Term查询;如果需要对分词后的文本进行匹配,可以选择Match查询。

match查询

# match 查询时,会对查询条件先分词
# 而name字段类型为keyword,不会分词,所以只能搜到name=张三的数据
GET index/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "_source": ["name","xm"]
}
# match 查询,会对查询条件先分词
# xm字段类型为text,用ik_max_smart分词,会分词,所以只能搜到文档xm字段分词后,结果为张三分词后的所有数据
GET index/_search
{
  "query": {
    "match": {
      "xm": "张三"
    }
  },
  "_source": ["name","xm"]
}

 

term查询

# term 查询时,不会对查询条件进行分词,name为keyword,所以只能完全匹配
GET index/_search
{
  "query": {
    "term": {
      "name": "张三"
    }
  }
}
# term 查询,不会对查询条件进行分词
# xm字段类型为text,用ik_max_smart分词,会分词,所以能查到文档分词后为张三的数据
GET index/_search
{
  "query": {
    "term": {
      "xm": "张三"
    }
  },
  "_source": ["name","xm"]
}

 

过滤字段查询

# 查询结果只展示 name和xm两个字段
GET index/_search
{
  "_source": ["name","xm"]
}

排序

# 查询结果排序
GET index/_search
{
  "_source": ["name", "age"], 
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

分页查询

# 分页查询
GET index/_search
{
  "_source": ["name", "age"],
  "from": 0,
  "size": 2
}

多条件查询(布尔值查询)

must

类似sql中的 and

# 查询 name = 张三 并且 age = 30 
GET index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "age": "30"
          }
        }
      ]
    }
  }
}

should

类似sql中的 or

# 查询 name = 张三 或者 name = 李三
GET index/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "name": "李三"
          }
        }
      ]
    }
  }
}

must_not

类似sql中的 not in

# 查询 name != 张三 并且 name != 李三 
GET index/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "name": "李三"
          }
        }
      ]
    }
  }
}

filter

在Elasticsearch中,过滤器(Filter)是一种用于精确筛选文档的查询子句,主要用于限制搜索结果的范围。与查询(Query)不同,过滤器不会评分和排序结果,而是根据指定的条件进行筛选。这可以提高查询性能,特别是在过滤大量文档的情况下。

过滤器可以用于各种条件,如范围查询、存在性检查、逻辑运算等。常见的过滤器类型包括:

  1. Term Filter:根据指定的词项进行精确匹配筛选。

  2. Range Filter:通过指定的范围进行筛选,可以用于数值、日期等字段。

  3. Exists Filter:检查字段是否存在于文档中。

  4. Bool Filter:通过逻辑运算符(AND、OR、NOT)对其他过滤器进行组合。

  5. Geo Distance Filter:通过指定的地理位置和距离范围进行地理位置过滤。

  6. Script Filter:使用自定义脚本进行筛选。

过滤器可以单独使用,也可以与查询结合使用。如果需要对搜索结果进行精确的筛选,并且不需要评分和排序,建议使用过滤器来提高查询性能。

# 查询xm=张三,并且age < 30 且 age >= 10 ,并且age 倒序
GET index/_search
{
  "_source": ["xm","age"],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "xm": "张三"
          }
        }
      ], 
      "filter": [
        {
          "range": {
            "age": {
              "gte": 10,
              "lt": 30
            }
          }
        }
      ]
    }
  },"sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

# 查询xm=张三,并且age < 30 且 age >= 10 ,并且 xm 字段值
GET index/_search
{
  "_source": ["xm","age"],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "xm": "张三"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "age": {
              "gte": 10,
              "lt": 30
            }
          }
        },
        {
          "exists": {
            "field": "xm"
          }
        }
      ]
    }
  }
}

 

高亮查询

# 对搜索结果命中的字段添加自定义html标签
GET index/_search
{
  "query": {
    "term": {
      "xm": {
        "value": "张三"
      }
    }
  }, 
  "highlight": {
    "pre_tags": "<font color = 'red'>",
    "post_tags": "</font>", 
    "fields": {
      "xm": {}
    }
  },
  "_source": "xm"
}

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

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

相关文章

Qt应用开发(基础篇)——堆栈窗口 QStackedWidget

一、前言 QStackedWidget继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt常用的堆栈窗口部件。 框架类QFrame介绍 QStackedWidget堆栈窗口&#xff0c;根据下标切换&#xff0c;一次显示一个小部件&#xff0c;常用于应用界面切换、图片轮询播放等场景。 二、QSt…

Linu网络服务NFS

linux网络服务NFS 一.NFS简介二.NFS原理三.NFS优势四.配置文件五.NFS共享存储服务的操作步骤 一.NFS简介 NFS&#xff08;网络文件服务&#xff09; NFS是一种基于tcp/ip传输的网络文件系统协议&#xff0c;最初由sun公司开放通过使用NFS协议&#xff0c;客户机可以像访问本地…

Java课题笔记~ ServletContext

单个Servlet的配置对象 web.xml <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.ambow.test.FirstServlet</servlet-class><init-param><param-name>charset</param-name><param-value>utf-8&…

SpringMVC注解配置

1xml配置方式&#xff08;配置文件注解的方式&#xff09; 前提导入相关依赖&#xff1a;pom文件 说明&#xff1a;下方依赖是ssm项目中较为常用的一部分&#xff0c;可能部分依赖对于springmvc配置并未有关系&#xff0c;根据自己需求添加和删除。 <dependencies> &l…

新手如何快速学习单片机?

初步确定学习目标&#xff1a;是学习简单便宜的51呢&#xff0c;还是学习简单但是性价比已经不算太高的&#xff0c;但是功能强大稳定可靠的avr&#xff0c;还是物美价廉的stm32&#xff0c;或者ARM9&#xff08;可以跑系统了&#xff09;&#xff0c;再往上x86什么的如果是学8…

成员变量和局部变量的区别

局部变量成员变量 1、定义的位置不一样 在方法的内部&#xff0c;方法申明上&#xff08;形参&#xff09;。 声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量 在方法的外部&#xff0c;直接写在类当中 &#xff08;类中方法外的变量&#xff09; 2、作用范…

opencv 实现手势跟踪并返回位置信息(封装调用)

OpenCV 是一个基于 Apache2.0 许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、Android和Mac OS操作系统上。 需要提前准备opencv 和 mediapipe库 pip --default-timeout5000 install -i https://pypi.tuna.t…

什么是IMAP协议?

IMAP&#xff08;Internet Message Access Protocol&#xff09;是一个应用层协议&#xff0c;用于访问和管理存储在远程服务器上的电子邮件。相比于POP3&#xff0c;IMAP提供了更加丰富的功能&#xff0c;特别适用于需要在多台设备上访问电子邮件的用户。以下是关于IMAP的详细…

支持多用户协同的思维导图TeamMapper

什么是 TeamMapper &#xff1f; TeamMapper 是基于 Mindmapp 开发的用于绘制思维导图的 Web 应用程序。它使得思维导图变得简单&#xff0c;你可以托管并创建您自己的思维导图。与您的团队分享您的思维导图会议并在思维导图上进行协作。 软件特点&#xff1a; 创建&#xff1…

解决:Unexpected ‘debugger‘ statement.eslint(no-debugger) (即:页面中的 debugger 标红)的问题

1、问题描述&#xff1a; 其一、报错为&#xff1a; Unexpected debugger statement.eslint(no-debugger) 中文为&#xff1a; 意外的“调试器”语句.eslint&#xff08;无调试器&#xff09; 其二、问题描述为&#xff1a; 在正常的 vue 项目中使用 debugger 的调试过程…

人工智能原理(2)

目录 一、知识与知识表示 1、知识 2、知识表示 3、知识表示方法 二、谓词逻辑表示法 1、命题逻辑 2、谓词逻辑 三、产生式表达法 1、知识的表示方法 2、产生式系统组成 3、推理方式 4、产生式表示法特点 四、语义网络 1、概念及结构 2、语义网络的基本语义联系 …

bye 我的博客网站

Bye&#x1f64b;&#x1f64b;&#x1f64b;&#xff0c;我的博客网站。在我的服务器上运行了9个月之久的博客网站要和大家Bye了。 背景 可能很多人不知道我的这个博客网站的存在&#xff0c;好吧&#xff0c;最后一次展示它了&#xff0c;博客网站地址在这里&#xff0c;它…

空降流量危机?QQ音乐升级架构应对高并发

# 关注并星标腾讯云开发者 # 每周3 | 谈谈我在腾讯的架构设计经验 # 第2期 | 赵威&#xff1a;QQ音乐评论系统如何实现高可用&#xff1f; QQ 音乐自诞生以来&#xff0c;已有多个版本的评论业务系统。最新版本是19年再次全新迭代&#xff0c;基于 tlist 存储&#xff0c;按照发…

章节4:JavaScript操作Cookie

章节4&#xff1a;JavaScript操作Cookie 直接利用Cookie登录 JavaScript语法 获取&#xff1a;document.cookie; 设置&#xff1a;document.cookie“usernamexx”; 删除&#xff1a;document.cookie“usernamexx;expiresThu, 01 Jan 1970 00:00:00 GMT”;

Goland报错 : Try to open it externally to fix format problem

这句报错的意思也就是 : 尝试在外部打开以解决格式问题 解决方案 : 将图片格式该为.png格式&#xff0c;再粘贴进去就可以了! 改变之后的效果 : 那么&#xff0c;这样就ok了

Unity ML-Agent

介绍: 环境搭建 待为完序

javascript数据类型与引用类型的区别以及原始值详解

基本数据类型介绍 在JavaScript中,数据类型可以分为基本数据类型与引用数据类型.其中基本数据类型包括 Undefined,Null,Boolean,Number,String5种数据类型,在ES6中新增了两种基本的数据类型,Symbol,bigint 引用类型有Object,Function,Array,Date,RegExp等 这两种类型区别简略…

JavaScript高级:原型和原型链

在 JavaScript 中&#xff0c;原型与原型链是一种强大的继承机制&#xff0c;它使对象之间能够共享属性和方法&#xff0c;从而实现高效的代码复用。虽然这听起来可能有些复杂&#xff0c;但是我们可以用通俗易懂的方式来理解这个概念。本文将为你详解原型和原型链的概念与作用…

win11虚拟机安装

win11虚拟机安装 下载虚拟机客户端安装客户端创建虚拟机下载 ISO切换root账号GNOME桌面 下载虚拟机客户端 版本是16.2.3 链接&#xff1a;https://pan.baidu.com/s/13c6XVWFbeQKbCnrlfxD8cA 提取码&#xff1a;qxdc 安装客户端 安装向导 点击下一步 接收条款&#xff0c;点…

C#小轮子:自动连续Ping网络地址

文章目录 前言Ping代码异步问题 前言 工作中&#xff0c;我们经常用到Ping这个指令&#xff0c;有时候我们需要Ping整个网段来查看这个网段上面有什么设备&#xff0c;哪些Ip地址是通的&#xff0c;这个时候就需要Ping指令 Ping 代码 我这个是批量Ping的代码&#xff0c;而…