ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询
基本概念
索引:
类似于MySQL的表。索引的结构为全文搜索作准备,不存储原始的数据。
索引可以做分布式。每一个索引有一个或者多个分片 shard。每一个分片可以有多个副本 replica。
文档:
类似与MySQL的一行记录。
映射:
所有文档写入索引之前,会进行分析, 分析将输入的文本进行分割为词条,分析哪些词条会被过滤。
文档类型:
每个文档都可以有不同的结构。
不同的文档类不能为相同的属性设置不同的类型。
【同一索引中所有文档类型中,一个title字段必须是相同的类型】
索引操作
添加索引
创建不指定文档,文档类型的索引库
PUT:127.0.0.1:9200/index_name
{
"settings": {
"index": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
}
}
创建指定文档,文档类型的索引库
PUT:127.0.0.1:9200/test_stu
{
"settings": {
"index": {
"number_of_shards": "2",
"number_of_replicas": "0"
}
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
},
"mail": {
"type": "keyword"
},
"hobby": {
"type": "text"
}
}
}
}
查看映射
GET:127.0.0.1:9200/test_stu/_mapping
删除索引
DELETE:127.0.0.1:9200/index_name
文档操作
添加文档
POST:127.0.0.1:9200/{index_name}/{type_name}/{_id 非必需}
# 指定数据的唯一标示符
POST:127.0.0.1:9200/test/user/1001
{
"id": 1001,
"name": "张三",
"age": 10,
"sex": "男"
}
# 不指定数据的唯一标示符
POST:127.0.0.1:9200/test/user
{
"id": 1002,
"name": "张五",
"age": 11,
"sex": "男"
}
删除文档
DELETE:127.0.0.1:9200/{index_name}/{type_name}/{_id 非必需}
说明:
删除一个文档的时候不会立即从磁盘上移除,它只是被标记为已删除。
Elasticsearch 将会在以后添加更多索引的时候才会在后台进行删除内容的清理。
修改文档
全局覆盖
在 Elasticsearch 中,文档数据是不能被修改的,但是可以通过指定唯一标示符的方式进行覆盖更新
PUT:127.0.0.1:9200/test/user/1001
{
"id": 1010,
"name": "张三",
"age": 11,
"sex": "男"
}
局部更新
1、从旧文档中检索到JSON;2、修改;3、删除旧文档;4、索引新文档
POST:127.0.0.1:9200/test/user/1001/_update
{
"doc":{
"age": 100
}
}
查询文档
查询文档
根据ID搜索数据
GET:127.0.0.1:9200/test/user/1001
获取所有数据默认10条
GET:127.0.0.1:9200/test/user/_search
根据关键词搜索数据
GET:127.0.0.1:9200/test/user/_search?q=age:100
DSL搜索
Elasticsearch 提供的丰富的灵活的查询语言叫做DSL查询【Query DSL】
filter 过滤
must 匹配
POST:127.0.0.1:9200/test/user/_search
{
"query": {
"match": {
"age": 20
}
}
}
全文检索
POST:127.0.0.1:9200/test/user/_search
{
"query": {
"match": {
"name": "三 五"
}
}
}
高亮显示
POST:127.0.0.1:9200/test/user/_search
{
"query": {
"match": {
"name": "三 五"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
聚合操作
类似SQL中的 group by 操作
POST:127.0.0.1:9200/test/user/_search
{
"aggs": {
"all_interests": {
"terms": {
"field": "age"
}
}
}
}
判断文档是否存在
HEAD:127.0.0.1:9200/test/user/1001
存在:HTTP状态码为200
不存在:HTTP状态码为404
批量查询数据
POST:127.0.0.1:9200/test/user/_mget
{
"ids": [ 1001, 1002 ]
}
批量添加数据
POST:127.0.0.1:9200/test/user/_bulk
注意:数据最后要有一个空行
{ "create": { "_index": "test","_type": "user","_id": 1010 }}
{ "id": 1010,"name": "1010","age": 10,"sex": "女" }
{ "create": { "_index": "test","_type": "user","_id": 1011 }}
{ "id": 1011,"name": "1011","age": 11,"sex": "女" }
批量删除数据
POST:127.0.0.1:9200/test/user/_bulk
注意:数据最后要有一个空行
{ "delete": { "_index": "test","_type": "user","_id": 1010 }}
{ "delete": { "_index": "test","_type": "user","_id": 1011 }}
分页
和SQL中使用LIMIT关键词返回一页的结果一样。ELasticssearch接受from和size参数
size:结果数;默认是10
from:偏移量;默认是0
如果每页显示5条数据,页码从1到3,那请求分别如下:
GET:127.0.0.1:9200/test/user/_search?size=5
GET:127.0.0.1:9200/test/user/_search?size=5&from=5
GET:127.0.0.1:9200/test/user/_search?size=5&from=10
数据类型
自动判断
| JSON TYPE | Field type |
| :- | :- |
| Boolean:true or false | boolean |
| 123 | long |
| 123.45 | double |
| 2014-09-15 | date |
| "string" | string |
Elasticsearch 中支持的类型
| 类型 | 表示的数据类型 |
| ---- | ---- |
| string | string, text, keyword |
| whole number | byte, short, integer, long |
| floating point | float, double |
| boolean | boolean |
| date | date |
5.x 开始,不支持string,由 text 和 keyword 类型代替。
text 类型,当一个字段需要被全文搜索的时候,比如 Email内容,产品描述,应该使用 text类型。
设置 text 类型之后,字段内容会被分析。
text 类型的字段不用于排序,很少用于聚合。
keyword 类型适用于索引结构优化的字段。比如 Email地址,主机名,状态等。
keyword 类型的字段只能通过准确值搜索到。
结构化查询 - term 精确查询
主要用于精确匹配值。比如数字,日期,布尔值,或者不能进行分词的字符串
例如:查询年龄为16的学生
POST:127.0.0.1:9200/test_stu/_doc/_search
{
"query": {
"term": {
"age": 16
}
}
}
结构化查询 - terms 查询
和 term 有点类似,但是 terms 允许指定多个匹配条件。
如果某个字段指定了多个值,那么文档需要一起去做匹配;
例如:查询年龄为16和15的学生
POST:127.0.0.1:9200/test_stu/_doc/_search
{
"query": {
"terms": {
"age": [16,15]
}
}
}
结构化查询 - range 范围查询
gt:大于
gte:大于等于
lt:小于
let:小于等于
例如:查询年龄在 15 到 22 之间的学生
POST:127.0.0.1:9200/test_stu/_doc/_search
{
"query": {
"range": {
"age": {
"gte": 15,
"lte": 22
}
}
}
}
结构化查询 - exists 查询
exists 查询用于查找文档中是否包含指定字段。
例如:查询文档中是否包含 title 字段
POST:127.0.0.1:9200/test_stu/_doc/_search
{
"query": {
"exists": {
"field": "title"
}
}
}
结构化查询 - match 标准查询
match 查询是一个标准查询,不管你是否需要全文检索还是精准查询都可以使用。
例如:查询年龄为15岁的用户
POST:127.0.0.1:9200/test_stu/_doc/_search
{
"query": {
"match": {
"age": 15
}
}
}
结构查询 - bool 查询
bool 查询可以用来合并多个条件查询结果的布尔逻辑,包含以下逻辑:
must 多个查询条件的完全匹配,相当于 and;
"must": {
"match": { "hobby": "跑步" }
}
must_not 多个查询条件的相反匹配,相当于 not;
"must_not": {
"match": { "hobby": "跑步" }
}
should:至少有一个查询条件匹配,相当于 or;
"should": {
"match": { "hobby": "跑步" }
"match": { "hobby": "爬山" }
}
例如:查询姓名中包含六且爱好不包含跑步的数据
POST:127.0.0.1:9200/test_stu/_doc/_search
{
"query": {
"bool": {
"must": {
"match": {
"name": "六"
}
},
"must_not": {
"match": {
"hobby": "跑步"
}
}
}
}
}
过滤查询 filter 查询
例如:查询年龄为20的用户
POST:127.0.0.1:9200/test_stu/_doc/_search
{
"query": {
"bool": {
"filter": {
"term": {
"age": 15
}
}
}
}
}
查询和过滤对比:
多虑语句会询问每个文档的字段值是否包含着特定值;
查询语句会询问每一个文档的字段值与特定值的匹配程度如何;
查询语句不仅要查找匹配的文档,还需要计算每个文档的相关性;
所以一般来说查询语句要比过滤语句更耗时,并且查询结果也不可缓存。
建议:
做精确匹配搜索的时候,最好使用过滤语句,因为过滤语句可以缓存数据。
添加报错
1、添加数据出错
报错: [FORBIDDEN/12/index read-only/allow delete (api)];
原因: 这个索引是只读状态。
解决: PUT:http://127.0.0.1:9200/索引名称/_settings
{
"index.blocks.read_only_allow_delete": false
}
2、创建索引报错
报错: Root mapping definition has unsupported parameters
原因: ElasticSearch 7.x 默认不在支持指定索引类型;默认索引类型是_doc
ElasticSearch 基本概念 and 索引操作 and 文档操作 and 批量操作 and 结构化查询 and 过滤查询的更多相关文章
- ES入门三部曲:索引操作,映射操作,文档操作
ES入门三部曲:索引操作,映射操作,文档操作 一.索引操作 1.创建索引库 #语法 PUT /索引名称 { "settings": { "属性名": " ...
- python 之 前端开发( jQuery选择器、筛选器、样式操作、文本操作、属性操作、文档操作)
11.5 jQuery 引入方式: 方式一:本地引入 <script src="jquery-3.3.1.min.js"></script> <scr ...
- jQuery二——属性操作、文档操作、位置属性
一.jquery的属性操作 jquery对象有它自己的属性和方法. 其中jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作. 1.html属性操作 是对htm ...
- mongodb安装,库操作,集合操作(表),文档操作(记录)
安装 1.下载地址 https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4.0.8-signed.msi 2.如果报没 ...
- jQuery 样式操作、文档操作、属性操作的方法总结
文档操作: addClass() 向匹配的元素添加指定的类名.after() 在匹配的元素之后插入内容.append() ...
- Python全栈开发之路 【第十六篇】:jQuey的动画效果、属性操作、文档操作、input的value
01-动画效果 show 显示 概念:显示隐藏的匹配元素 语法:show(speed,callback) 参数: speed:三种预定速度之一的字符串('slow','normal','fast')或 ...
- 33 -jQuery 属性操作,文档操作(未完成)
- 【Elasticsearch 7 探索之路】(二)文档的 CRUD 和批量操作
上一篇,我们介绍了什么是 Elasticsearch,它能做什么用以及基本概念(索引 Index.文档 Document.类型 Type)理解.这篇主要对 文档的基本 CRUD 和 倒排索引进行讲解. ...
- ElasticSearch文档操作介绍三
ElasticSearch文档的操作 文档存储位置的计算公式: shard = hash(routing) % number_of_primary_shards 上面公式中,routing 是一个可变 ...
随机推荐
- 「疫期集训day12」阴雨
我们走进了泥泞的雨林----阿尔贡森林里艰难前进的士兵 今天考试一般,T1T2签到题没啥好说的,剩下三个小时全肛T3(我脑子有泡,前几天刚做了一道类似T4的难题,公式更难推),9:00->10: ...
- vue+elementUI 图片上传问题
图片上传问题,获取后台的图片,并点击可以更换图片,并把图片存储到数据库中: (1)在编辑页面上,action指的图片上传的地址,header指请求头: (2)因为element-ui有自己上传的接口, ...
- django 本地项目部署uwsgi 以及云服务器部署 uwsgi+Nginx+Docker+MySQL主从
一 .django 本地项目部署uwsgi 1 本地部署项目 uwsgi安装测试 通过uwsgi 进行简单部署 安装uwsgi命令:pip install uwsgi -i http://pypi.d ...
- jvm之栈、堆
1. Java Virtual Machine 人群当中,一位叫java的小伙子正向周围一众人群细数着自己取得的荣耀与辉煌.就在此时,c老头和c++老头缓步走来,看着被众人围住的java,c老头感 ...
- 已知如下代码,如何修改才能让图片宽度为 300px ?注意下面代码不可修改。
<img src="1.jpg" style="width:480px!important;”> 总结: max-width:300px transform: ...
- 智联家园-四大人工智能虚拟形象首秀MV
2020 世界人工智能大会云端峰会在上海举行,由微软小冰作曲并携手其他 AI 演唱的 2020 世界人工智能大会云端峰会主题曲<智联家园> 今天正式发布,同时这也是小冰上海音乐学院毕业后的 ...
- Idea JAVA开发工具快速上手-常用快捷键汇总
前言: 之前一直使用Eclipse 系列开发IDE工具,由于eclipse是开源的所以,一般情况,eclipse基本上每一个java入门者的首选开发工具,其次 Myeclipse.不过现在越来越多的人 ...
- uPDF-功能强大的PDF文件处理小工具
前几天因为工作原因,需要将一个PDF压缩一下. 网上找了半天,要么收费,要么就是转换的质量不太好.论坛也找到一些破解的软件,但是总有点不太合适,有些功能还挺复杂.也有些在线转换的,又考虑到自己较为隐私 ...
- PowerShell创建参考窗口
背景 平常我们经常遇到这样一个问题,在使用一个窗口工作时常常需要参考其他窗口的文字或图片,此时就需要频繁切换窗口:或者是看视频时需要参考前面进度的画面:或者是阅读或写文档时需要参考其他位置的文字,这时 ...
- 事件的event对象基本解释
事件流: 描述的是在页面中接受事件的顺序主要分为两种: 事件冒泡.事件捕获 事件event对象:1. type 获取事件类型2. target获取事件目标3. stopPropagation() 阻止 ...