首页 > 其他分享 >1.ES入门与基本操作

1.ES入门与基本操作

时间:2023-06-07 23:46:55浏览次数:43  
标签:入门 查询 索引 文档 query 基本操作 2.4 ES 请求

1.介绍与安装

1.1.ElasticStack核心

The Elastic Stack,包括 Elasticsearch、Kibana、Beats 和Logstash(也称为ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。

ES(ElaticSearch)是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。

1.2.ES And Solr

目前流行的两个搜索引擎软件(ElasticsearchSolr)都是基于Lucene搭建的,可以独立部署启动的搜索引擎服务软件。由于内核相同,所以两者除了服务器安装、部署、管理、集群以外,对于数据的操作修改、添加、保存、查询等等都十分类似。

LuceneApache软件基金会Jakarta项目组的一个子项目,提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。

在 Java开发环境里Lucene是一个成熟的免费开源工具。Lucene是目前最受欢迎的免费Java信息检索程序库。

Lucene只是一个提供全文搜索功能类库的核心工具包,而真正使用它还需要一个完善的服务框架搭建起来进行应用。

ElasticsearchSolr对比

image-20230606222328217

  • Elasticsearch
    • 虽拥有的规模较小但活跃的用户社区以及不断增长的贡献者社区。
    • 提交者来自单个公司
    • 增长迅速,更稳定
    • 文档组织良好,但缺乏好的示例和清晰的配置说明
    • 如果Elasticsearch管理不当,这种易于部署和使用可能会成为一个问题。
    • 如果应用使用的是JSON,那么Elasticsearch是一个更好的选择。
    • 易于安装且非常轻巧
  • Solr
    • 拥有更大,更成熟的用户,开发者和贡献者社区。
    • 贡献者和提交者来自许多不同的组织
    • 更成熟
    • 是一个非常有据可查的产品,具有清晰的示例和API用例场景
    • Solrschema.xmlsolrconfig.xml有很好的文档记录。

为什么选择Elasticsearch

  1. 易于使用,在新开发者中更受欢迎,一个下载和一个命令就可以启动一切。
  2. 除了搜索文本之外还需要它来处理分析查询
  3. 需要分布式索引
  4. 需要良好可伸缩性和以及性能分布式环境
  5. 需要监控和指标

1.3.安装

官网:https://www.elastic.co/cn/elasticsearch/

安装和其他软件一样,常规安装

安装后目录

目录 含义
bin 可执行脚本目录
config 配置目录
jdk 内置 JDK 目录
lib 类库
logs 日志目录
modules 模块目录
plugins 插件目录

bin目录下的elasticsearch.bat文件为启动ES服务

9300 端口为 Elasticsearch 集群间组件的通信端口,9200 端口为浏览器访问的 http协议 RESTful 端口。

问题

启动失败,通过路径访问追踪错误,如果是“空间不足”,修改config/jvm.options配置文件

# 设置JVM初始内存为1G。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 
# Xms represents the initial size of total heap space 
# 设置JVM最大可用内存为1G 
# Xmx represents the maximum size of total heap space 
-Xms1g 
-Xmx1g 

Elasticsearch是使用java开发的,7.8 版本的ES需要JDK版本1.8以上,默认安装包带有jdk环境,如果系统配置了JAVA_HOME,那么使用系统默认的JDK,如果没有配置使用自带的JDK

1.4.数据格式

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。

Elasticsearch存储文档数据和关系型数据库MySQL存储数据进行类比

image-20230607092221178

ES里的Index可以看做一个库,而Types相当于表(在7.x版本中已经被删除),Documents则相当于表的行。

2.基本操作

2.1.HTTP中使用索引操作

2.1.1.创建索引

http://ip地址:9200/创建的索引名字
使用PUT方式请求

image-20230607093843071

注意:创建索引库的分片数默认1片,在7.0之前的Elasticsearch版本中,默认5片

如果重复添加索引,会返回错误信息

image-20230607093932586

2.1.2.获取单个索引

http://ip地址:9200/要查询的索引名字
使用GET方式请求

image-20230607094559551

2.1.3.获取全部索引

http://ip地址:9200/_cat/indices?v
使用GET方式请求
_cat:查看
indices:表示索引

image-20230607095125301

2.1.4.删除索引

http://ip地址:9200/要删除的索引名字
使用DELETE方式请求

image-20230607095321306

2.2.HTTP中使用文档操作

2.2.1.创建文档

请求路径
http://ip地址:9200/索引名字/要创建的文档名字
请求方式:POST
请求体内容(JSON格式)
{
    "title":"电饭煲", 
    "price":399.00
}

image-20230607101012454

上面的数据创建后,由于没有指定数据唯一性标识(ID),默认情况下,ES 服务器会随机生成一个。

如果想要自定义唯一性标识,需要在创建时指定

http://ip地址:9200/索引名字/文档名字/指定id

注意:如果增加数据时明确数据主键,那么请求方式也可以为 PUT

2.2.2.查看单个文档

请求路径
http://ip地址:9200/索引名字/要查看的文档名字/id
请求方式:GET

image-20230607101554448

2.2.3.查询所有文档

请求路径
http://ip地址:9200/索引名字/_search
请求方式:GET

image-20230607102014916

2.2.4.修改文档所有内容

请求路径
http://ip地址:9200/索引名字/文档名字/id
请求方式:POST
请求体内容(JSON格式)
{
    "title":"电饭煲", 
    "price":499.00
}

image-20230607102247753

2.2.5.修改文档局部内容

请求路径
http://ip地址:9200/索引名字/_update/id
请求方式:POST
请求体内容(JSON格式)
{
	"doc":{
        "price":3000.00
	}
}

image-20230607103646240

查询image-20230607103702908

2.2.6.删除文档

逻辑删除

请求路径
http://ip地址:9200/索引名字/文档名字/id
请求方式:DELETE 

image-20230607103822401

2.2.7.条件删除文档

请求路径
http://ip地址:9200/索引名字/_delete_by_query
请求方式:POST 
请求体内容(规则):
详细在2.4

2.3.HTTP中使用映射操作

创建索引需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。

2.3.1.创建映射

请求路径
http://ip地址:9200/索引名字/_mapping
请求方式:PUT
请求头内容为规则
{ 
  "properties": { 
    "字段1":{ 
      "type": "text", 
      "index": true 
    }, 
    "字段2":{ 
      "type": "text", 
      "index": false 
    }, 
    "字段3":{ 
      "type": "long", 
      "index": false 
    } 
}
type(类型):
	String 类型
		text:可分词
		keyword:不可分词,数据会作为完整字段进行匹配 
	Numerical:数值类型
		基本数据类型:long、integer、short、byte、double、float、half_float
		浮点数的高精度类型:scaled_float
	Date:日期类型
	Array:数组类型
	Object:对象
index:是否索引,默认为true,不进行任何配置,所有字段都会被索引。 
	true:字段会被索引,则可以用来进行搜索
	false:字段不会被索引,不能用来搜索 
store:是否将数据进行独立存储,默认为 false 
	原始的文本会存储在_source 里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然也可以独立的存储某个字段,只要设置"store": true 即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。 
analyzer:分词器,这里的ik_max_word即使用ik分词器

2.3.2.查看映射

请求路径
http://ip地址:9200/索引名字/_mapping
请求方式:GET

2.3.3.索引映射关联

请求路径
http://ip地址:9200/索引名字
请求方式:PUT
请求体内容

2.4.HTTP中使用高级查询

2.4.1.查询所有文档

{ 
  "query": { 
    "match_all": {} 
  } 
}
  • query:查询对象,里面可以有不同的查询属性
  • match_all:查询所有

2.4.2.匹配查询

{ 
  "query": { 
    "match": {
    	"字段名" : "查询内容"
    } 
  } 
}
  • match:匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系

2.4.3.字段匹配查询

{ 
  "query": { 
    "multi_match": {
    	"query": "查询内容", 
        "fields": ["字段名1","字段名2"]
    } 
  } 
}
  • multi_match:与match类似,不同的是它可以在多个字段中查询。

2.4.4.关键字精确查询

{ 
  "query": { 
    "term": {
    	"字段名":{
    		"value":"查询内容"
    	}
  } 
}
  • term:精确的关键词匹配查询,不对查询条件进行分词。

2.4.5.多关键字精确查询

{ 
  "query": { 
    "terms": {
    	"字段名":["查询内容1","查询内容2"]
    }
  } 
}
  • terms:和term查询一样,但它可以指定多值进行匹配。

2.4.6.指定查询字段

方式1:_source

{ 
  "_source": ["返回字段1","返回字段2"], 
  "query": { 
	{
		查询条件
	}
  } 
}
  • 默认情况下,Elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。
  • 如果我们只想获取其中的部分字段,我们可以添加_source的过滤

方式2:includes与excludes

  • includes:指定想要显示的字段
  • excludes:指定不想要显示的字段
{ 
  "_source":{
  	"includes": ["字段1","字段2"]	或者
  	"excludes": ["字段1","字段2"]
  },
  "query": { 
	{
		查询条件
	}
  } 
}

2.4.7.组合查询

{ 
  "query": { 
    "bool": { 
      "must": [ 
        { 
          查询条件
        } 
      ], 
      "must_not": [ 
        { 
          查询条件
        } 
      ], 
      "should": [ 
        { 
          查询条件
        } 
      ] 
    } 
}
  • bool:把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方式进行组合

2.4.8.范围查询

{ 
  "query": { 
    "range": { 
      "字段名": { 
        "gte": 大于等于, 
        "lte": 小于等于 
      } 
    } 
}
  • range:查询找出那些落在指定区间内的数字或者时间

    操作符 说明
    gt 大于>
    gte 大于等于>=
    lt 小于<
    lte 小于等于<=

2.4.9.模糊查询

{ 
    "query": { 
            "fuzzy": { 
                "字段名": { 
                "value": "查询内容" 
            }
        }
    } 
}
  • 返回包含与搜索字词相似的字词的文档
  • 编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括
    1. 更改字符(box → fox)
    2. 删除字符(black → lack)
    3. 插入字符(sic → sick)
    4. 转置两个相邻字符(act → cat)
  • 为了找到相似的术语,fuzzy 查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。
  • 然后查询返回每个扩展的完全匹配。通过fuzziness修改编辑距离。
  • 一般使用默认值AUTO:根据术语的长度生成编辑距离

2.4.10.单字段排序

{ 
  "query": { 
    查询条件
  }, 
  "sort": [{ 
    "字段名": { 
        "order":"desc" 
     }
   } 
}
  • sort:按照不同的字段进行排序,并且通过order指定排序的方式。
    • desc:降序
    • asc:升序。

2.4.11.多字段排序

{ 
  "query": { 
    查询条件
  }, 
  "sort": [{ 
    "字段名1": { 
        "order":"排序方式" 
     },
    "字段名2": { 
        "order":"排序方式" 
     }
   } 
}

2.4.12.高亮查询

{ 
  "query": { 
    查询条件
  },
  "highlight": { 
    "pre_tags": "<font color='red'>", 
    "post_tags": "</font>", 
    "fields": { 
      "字段名": {} 
    }
  }
}
  • ES可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。

    在使用match查询的同时,加上一个highlight属性

    • pre_tags:前置标签
    • post_tags:后置标签
    • fields:需要高亮的字段
    • title:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空

2.4.13. 分页查询

{ 
  "query": { 
    查询条件
  }, 
  "from": 0, 
  "size": 2
}
  • from:当前页的起始索引,默认从 0 开始。 from = (pageNum - 1) * size
  • size:每页显示多少条

2.4.14.聚合查询

{ 
    "aggs":{ 
        "聚合函数名字":{ 
            "max(聚合函数)":{
                "field":"字段名"
            } 
        },
}
  • 聚合允许使用者对 es 文档进行统计分析,类似与关系型数据库中的group by
  • 还有其他的聚合,例如取最大值、平均值等等。

2.4.15.桶聚合查询

{ 
    "aggs":{ 
          "名字":{ 
            "terms":{
                "field":"字段"
            } 
          }     
      },
}

2.5.java中使用索引操作

2.5.1.添加依赖

image-20230607124845658

2.5.2.创建索引

image-20230607131029747

2.5.3.查看索引

image-20230607131245572

2.5.4.删除索引

image-20230607131418782

2.6.java中使用文档操作

2.6.1.添加依赖

image-20230607124845658

准备一个User类

image-20230607132017750

2.6.2.创建文档

image-20230607133107711

2.6.3.修改文档

image-20230607133551048

2.6.4.查询文档

image-20230607133756809

2.6.5.删除文档

image-20230607133956839

2.6.6.批量新增

image-20230607135227029

2.6.7.批量删除

image-20230607135500315

2.7.java中使用高级查询

2.7.1.查询所有

image-20230607163304537

2.7.2.精确查询

image-20230607164457623

2.7.3.分页查询

image-20230607164646845

2.7.4.数据排序

image-20230607164759855

2.7.5.过滤字段

image-20230607165044150

2.7.6.组合查询

image-20230607170036342

2.7.7.范围查询

image-20230607170341065

2.7.8.模糊查询

image-20230607170831568

2.7.9.高亮查询

这里没显示是因为这个是网页的显示效果,需要在网页才能看到

image-20230607171736855

2.7.10.聚合查询

其他的操作都在

image-20230607232352154

举例一个

image-20230607232756666

2.7.11.分组查询

image-20230607233100338

标签:入门,查询,索引,文档,query,基本操作,2.4,ES,请求
From: https://www.cnblogs.com/Myvlog/p/17464901.html

相关文章

  • Codeforces Round 876 (Div. 2) 题解 A - D
    A.TheGoodArray题目大意给定两个整数\(n\)和\(k\),规定一个\(01\)数列为好的的条件是,对于\(1\simn\)中任意的\(i\),都有:\(a\)的前\(i\)个元素中至少有\(\lceil\frac{i}k\rceil\)个都是\(1\)。\(a\)的后\(i\)个元素中至少有\(\lceil\frac{i}k\rceil\)个都是......
  • esxi下虚拟机如何迁移,换硬盘也适用
    安装好了的虚拟机,运行都算稳定,但是安装的时候是小硬盘,现在有大硬盘了想把所有的虚拟机合并在一块硬盘中 好像没有什么教程,我尝试用土方法转移一次!1、目前虚拟机的情况2、存储情况 3、先拿一个简单的开刀。把win7迁移到1T的那个盘中去。4、关闭虚拟机5、浏览数据在目......
  • 8.12 压制警告 @SuppressWarning
    classChannel{@Deprecated//老系统继续用,新系统不要用了---编译会有提示,但执行成功;publicvoidconnect(){System.out.println("*****Channel******");}publicStringconnection(){return"获取了xxx通道信息.";}}public......
  • Java SPI META-INF/services 详解
    目录什么是SPISPI和API的使用场景SPI的简单实现SPI原理解析DubboSPI总结什么是SPISPI(ServiceProviderInterface)是JDK提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。SPI的作用就是为这些被扩展的API寻找服务实现。SPI和API的使用场景......
  • codeforces.com/contest/1553/problem/B
    简单字符串哈希题意给一个字符串s和t,问从s的某个位置开始,向右到某个点后再向左,顺序遍历到的字符形成的字符串可否为t。思路数据只有500,\(O(n^3)\)可过,枚举转折点,然后枚举开头和结尾。代码intn,m,k;ullHash[1010],rHash[1010],p[1010],rp[1010],sum;voidsolve(){ ......
  • TypeScript开篇
    1.什么是TypeScript(TS)?Typescript为JS带来了类型能力,如今已被越来越多的大型前端项目选用。Typescript的出现大大改善了开发体验,增强了代码的可维护性和稳定性。TypeScript简称TSTS和JS之间的关系其实就是Less/Sass和CSS之间的关系就像Less/Sass是对CSS进行扩展一样,TS也是......
  • TypeScript核心基础
    前言为了方便我们直接使用脚手架让他帮我们直接编译就完事了创建一个Vue应用前提条件熟悉命令行已安装16.0或更高版本的Node.jsnpminitvue@latest这一指令将会安装并执行create-vue,它是Vue官方的项目脚手架工具。你将会看到一些诸如TypeScript和测试支持之类的可选功能......
  • 9_How to install phpMyAdmin on Nginx (in 5 minutes)
     地址:https://www.codewithharry.com/blogpost/install-phpmyadmin-ubuntu-nginx/  HowtoinstallPhpMyAdminonUbunturunningNginx(LEMPstack)Inthispost,wewillseehowtoinstallphpMyAdminonserversrunningNginx.Followthestepsbelow:Step1-......
  • Vue零基础开发入门
    讲解部分Vue基础语法,通过TodoList功能编写,在熟悉基础语法的基础上,扩展解析MVVM模式及前端组件化的概念及优势。1案例1.1下载安装https://v2.cn.vuejs.org/v2/guide/installation.html:1.2原生实现打印<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8......
  • kanzi的安卓工程报错解决办法:Error: Could not find or access Kanzi's Gradle plugin
    这是因为安卓里配置的环境变量不对。需要检查下述文件的路径是否真实存在,以及和使用的版本是否匹配  ......