javascript玩转ElasticSearch(一)
javascript玩转ElasticSearch(一)
- 前言
- 开始
- 准备工作
- 一 查询
- 二 创建
- 1 直接插入数据
- 2 先建立mapping映射,再插入数据
- 2.1 查询mapping
- 2.2 设置mapping
- 2.3 总结
- 三 修改
- 四 删除
- 3.1 删除单条数据
- 3.2 删除多条数据
前言
大家好。本人是一个前端开发工程师,作为一个不喜欢写页面的前端开发工程师,总是整天想着玩一些后台数据库的东西。ElasticSearch是一款非常先进好用的数据库框架,使用ElasticSearch作为数据库应用一些小型项目的话,可以做到不用写后台接口,基本上纯javascript就可以搞定一个项目。我的博客《使用CDN的方式使用Vue 和 iview构建vue项目》提到的那个项目,就是使用ElasticSearch开发的。后来机缘巧合又参与了另外一个项目,发现ElasticSearch真的非常好用,本着跟大家一起学习的心态,我打算写这一系列博客,来记录我这段时间的一些心得。另外,在文末会附上github源码,可供调试,学习。
开始
关于ElasticSearch安装的教程网上很多,这里我就不一一介绍安装过程了。关于安装问题,本人也有一篇博客,如果遇到问题可以参考。本人使用的开发环境如下,可以点击下载。下载的时候需要注意kibana需要和ElasticSearch版本保持一致。
项目 | 版本 |
---|---|
操作系统 | windows |
ElasticSearch | v6.5.3 |
Kibana | v6.5.3 |
准备工作
对于一个数据库,最基本的操作就是增删改查。对于一个前端开发人员,最熟悉的不过是javascript脚本了。使用脚本调用ElasticSearch很简单。只需如下几行代码。注意:
$.ajax({type: "get",contentType: 'application/json',url: `http://localhost:9200/index/type/_search`,success() {},error(data) { }})
contentType: ‘application/json’
由于我们传递给es的数据格式大部分采用的是json格式。所以建议所有的请求都带上上面那句话。否则对于复杂格式,无法传递到es服务器。接下来就是增删改查。
一 查询
var query = {}$.ajax({type: "post",contentType: 'application/json',data:JSON.stringify(query),url: `http://localhost:9200/index/type/_search`,success() {},error(data) { }})
一个post请求,将查询条件query对象发送到es服务器。目前查询条件为空。以后所有的查询条件都可以放到query下面。url地址中的index表示查询的对应索引,type表示查询的对应类型。
注意 在es之后的版本 一个索引下只能有一个类型,所以建议索引名和类型名称取一样,这样完完全全的,一个索引就是数据库的一张表。接下来的示例中,我会以游戏人物表作为示例讲解
二 创建
在我的项目中编写了创建索引以及插入记录的代码。只需要拿下来直接运行即可创建任意条数的测试信息。
我现在以游戏人物表character作为示例讲解,假设我们需要建立一个游戏人物表,其结构如下:
{"name":"关羽", //--人物姓名"attack":98, //--攻击力"defence":78, //--防御力"intelligence":80, //--智力"speed":400, //--速度"birthday":"2011-02-05", //--出生日期"isboy":true, //--是否为男性"equipments":[ //--拥有武器列表{"name":"青龙偃月刀", //--武器名称"atk":100, //--攻击力"skills":[{ //--武器技能列表"skillid":20, //--技能id"desc":"20%概率2倍暴击伤害" //--技能描述},{"skillid":21,"desc":"20%概率无视防御"}]}],"advance":{ //--高级信息"dots":["刘备","关羽","张飞"] //--缘分列表}}
可能结构略复杂,但是包括了es的大部分基本类型,也是为了之后的文章做查询语法讲解方便。
创建一张索引,有两种方式,一是通过直接post的方式插入一个json串数据,二是通过预先建立Mapping的方式,先确定表结构存储的数据格式,再插入数据。推荐使用方式二,具体mapping的使用我后面会在写博客说明。现在只需要了解基本的创建索引的方式。
1 直接插入数据
es机制是这样的,当我们使用post请求,请求对应的一张索引时,如果没有对应的索引,则会自动创建一条索引。所以只需要如下代码,你就可以创建一个character索引并且往里面插入一条数据。
var character= {} //--将上面的character数据拷贝过来$.ajax({type: "post",contentType: 'application/json',data:JSON.stringify(character),url: `http://localhost:9200/character/character`,success() {},error(data) { }})
我们使用一种的查询语法,将url中的索引和类型都替换为character,进行查询,会发现现在我们的es中创建了一个索引character并且有一条数据。当然,ElasticSearch三剑客之Kibana更为方便,快捷,具体的安装方式可以自己上网百度。很方便
GET /character/character/_search
返回如下:
{"took" : 3,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 1.0,"hits" : [{"_index" : "character","_type" : "character","_id" : "r1_jnWgB1wZfNkFWql0-","_score" : 1.0,"_source" : {"name" : "施孙刘","attack" : 57,"defence" : 72,"intelligence" : 32,"speed" : 448,"birthday" : "1996-04-16","isBoy" : false,"equipments" : [{"name" : "天枪","atk" : 21,"skills" : [{"skillid" : 842,"desc" : "阿福务费二发额服圾服大附圾费安阿发凤发飞"}]}],"advance" : {"lots" : ["刘备","马谡","大乔","马谡"]}}}]}
}
这是我用脚本生成的测试数据,不必计较里面的人名。我们需要关注的是返回的数据结构。我们先不关注其他的,只关注hits中的几项内容。
hits.total
表示当前查询到的所有记录条数
hits.hits
表示当前所有的记录
hits.hits._id
表示当前这条记录的id。可见是一个十分复杂的随机字符串。在创建时,可以在url后面指定该条记录的id。即
url: “http://localhost:9200/character/character/1”
这样,es就不会自动生成id,转而用提供的id标记这条记录。
hits.hits._source
表示我这条记录的内容,可以发现跟我们存入的内容是完全一致的。
2 先建立mapping映射,再插入数据
这里我只简单说明一下。es的mapping表示这个索引存储的类型,大部分情况下,直接插入数据,es为我们自动生成的类型都是对的。但是偶尔会存在不正确的情况。而且一旦索引mapping生成,很多情况下是无法修改的。所以建议先确定mapping之后再插入数据。
2.1 查询mapping
我们先看下我们刚才生成的character表结构的mapping
GET /character/character/_mapping
返回
{"character" : {"mappings" : {"character" : {"properties" : {......"birthday" : {"type" : "date"},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"speed" : {"type" : "long"}}}}}
}
可以发现es为我们的json格式的数据自动分配了类型。比如speed是long类型,甚至自动识别了birthday为date类型。这些类型对于我们的查询会很有帮助。假如birthday被预先设置为date类型,当我传递的数据比如 -2011-1-234这样的字符串时,则插入数据的时候会报错。反之,如果被设置成字符串类型,那么我接下来的查询则无法根据时间范围进行查询或者统计。
2.2 设置mapping
很简单,将上述查询到的mapping拿到之后,做出你想要的修改,然后通过post接口调用即可。注意,字段的类型(field)无法修改,这就是先确定mapping的重要原因
kibana:
POST /character/character/_mapping
{
//–这里填写上面的mapping数据
}
javascript:
var mapping= {} //--将上面的mapping数据拷贝过来$.ajax({type: "post",contentType: 'application/json',data:JSON.stringify(mapping),url: `http://localhost:9200/character/character/_mapping`,success() {},error(data) { }})
2.3 总结
注意,创建mapping首先要有索引。即有一个空索引才可以,所以我们要做的就是先删除刚才创建的那一个索引,创建一个空的数据,由于空数据没有字段,所以es不会自动生成mapping。再将这条空数据删除,再创建mapping.
所以在kibana中应该是按照如下逻辑进行:
POST /character/character/1
{}DELETE /character/character/1
POST /character/character/_mapping
{这里填写mapping}
在我的项目中 我已经将其封装为了一个函数createIndex,博友们只需要传入要建立的索引名称,再选择性的传入mapping,即可自动化创建一个索引。
三 修改
es修改数据是以文档为粒度的修改。即你只能复写一个文档内部的数据,而不能只修改文档中某个json的键值对。
使用post方式,传入要修改的数据和要修改的文档的id。
kibana:
POST /character/character/1
{
“age”:27
}
javascript:
var post_data = {age:27} $.ajax({type: "post",contentType: 'application/json',data:post_data,url: `http://localhost:9200/character/character/1`,success() {},error(data) { }})
注意 此时角色表id为1的文档已经被修改了。并没有新增一条age为27的字段,而是远来的文档字段被清空,只剩下一条age为27的文档。如果需要实现新增字段或者修改字段的功能,需要通过脚本,先get到原有文档,再添加或者修改文档之后,使用新的文档进行post。
四 删除
3.1 删除单条数据
单条数据的删除只需要在url结尾附上要删除的记录id即可。
kibana:
DELETE /character/character/1
javascript:
$.ajax({type: "delete",url: `http://localhost:9200/character/character/1`,success() {},error(data) { }})
3.2 删除多条数据
es对于批量操作有专门的语法。对于查询,有mget语法,对于批量操作,有bulk语法。对于大批量操作大量数据,js并不擅长。使用bulk的一般流程应该是使用python脚本生成批量操作文件,再发送以该文件作为请求体的请求。对于bulk语法,可以自行网上查找。当然,使用js可以使用interval和promise实现任何批量操作,只是执行时间的问题而已。我的示例中封装了一个请求发送的函数sendRequest。通过定时器的方式控制请求发送的频率,大家可以参考。
var sendRequest = function (reqs, time_stamp) {var interval = setInterval(() => {if (!reqs.length) {clearInterval(interval);return;}$.ajax(reqs.shift());}, time_stamp || 10)
}
今天先写到这里。接下来的文章会主要围绕查询和统计进行。
2022.6.3日(长期有效):打个广告,苏州华为终端BG面向社会招聘人才,Java /C C++ / Python / Javascript 。有兴趣来苏州的同学们 可以加我V 15850277051 ,走内推流程,有问必答!
javascript玩转ElasticSearch(一)相关推荐
- Javascript玩转Prototype(一)——先谈C#原型模式
在<Javascript玩转继承(二)>中,我使用了原型继承法来实现Javascript的继承,那原型究竟奥秘何在.在这篇文章中,我就主要针对原型来展开讨论. 抛开Javascript,我 ...
- JavaScript玩转机器学习:模型转换
JavaScript玩转机器学习:模型转换 模型转换 TensorFlow.js 配备了各种预训练模型,这些模型可以在浏览器中使用,模型仓库 中有相关介绍.但是,您可能已经在其他地方找到或创建了一个 ...
- JavaScript玩转机器学习:Node 中的 TensorFlow.js
JavaScript玩转机器学习:Node 中的 TensorFlow.js TensorFlow CPU TensorFlow CPU 包,可以按如下方式导入: import * as tf fro ...
- JavaScript玩转机器学习:保存并加载 tf.Model
JavaScript玩转机器学习:保存并加载 tf.Model 保存并加载 tf.Model TensorFlow.js提供了保存和加载模型的功能,这些模型可以是使用LayersAPI创建的或从现有T ...
- JavaScript玩转机器学习:训练模型
JavaScript玩转机器学习:训练模型 本指南假定您已经阅读了模型和图层指南. 在TensorFlow.js中,有两种方法来训练机器学习模型: 通过LayersModel.fit()或使用Laye ...
- JavaScript玩转机器学习:张量(Tensors) 和 操作(operations)
JavaScript玩转机器学习:张量(Tensors) 和 操作(operations) 张量(Tensors) 和 操作(operations) TensorFlow.js是一个在JavaScri ...
- JavaScript玩转机器学习:模型和层
JavaScript玩转机器学习:模型和层 模型和层 机器学习中,一个 model 是一个带有可训练参数的函数.这个函数将输入转化为输出.通俗的来说,这个函数表达了输入和输出之间的变换关系.我们通过在 ...
- 初学者都能学会的ElasticSearch入门实战《玩转ElasticSearch 2》
大家好,我是咔咔 不期速成,日拱一卒 项目中准备使用ElasticSearch,之前只是对ElasticSearch有过简单的了解没有系统的学习,本系列文章将从基础的学习再到深入的使用. 咔咔之前写了 ...
- Javascript玩转继承(一)
最近一直在学Javascript,打算写一些文章,算做自己的学习心得吧,也可以算是学习笔记.没有系统的知识点,太基础的不想写,主要是写一些自己觉得有价值的地方. 今天写第一篇. Javascript究 ...
最新文章
- 一个项目可以有多个源代码路径
- wps右键新建里面没有word和excel_WPS竟然出过这么多实用工具?每个都免费无广告,简直相见恨晚...
- 按钮的android程序闪退,Android实例化控件有什么特殊要求吗??怎么程序加了这一段之后就闪退。。...
- OCP大会 | 腾讯云Open DCN Networking(附PDF)
- mysql explain的使用(优化查询)
- 多项式的基础操作(逆元/除法/取模/对数ln/开根sqrt/指数exp/快速幂)带模板+luogu全套例题
- Kotlin学习笔记30 补充 作用域函数
- 5G(1)---5G 协议标准下载
- 问题 1020: [编程入门]猴子吃桃的问题
- python属于面向对象的还是面向过程的呀-面向过程和面向对象的理解
- GPU服务器硬件及软件
- 易智瑞大赛——地图故事组参赛经验
- 人工智能导论(10)——机器人(Robot)
- 动漫系列美化XP主题风暴下载
- 天基实业怎样投资理财收益稳定
- 百度搜索 屏蔽百家号
- 南航计算机科学与技术学院院徽,南京航空航天大学计算机科学与技术学院简介...
- 简单hashtab的实现
- (二)航空发动机强度与振动复习纲要
- Verilog中任务task的使用
热门文章
- Python实现Word表格转成Excel表格
- 全国计算机一级学科博士点,一级学科博士点高校排名
- 300以内的蓝牙耳机哪款好?半入耳蓝牙耳机南卡和漫步者测评
- 【经典推荐】10部关于数学的顶级纪录片
- 创意h5游戏案例:记忆类H5手机游戏评测
- STM32 FSMC 16位寻址 地址移位的解读
- android 禁止跟随系统字体,Android 应用全局字体调节或禁止随系统字体大小更改...
- qiankun+vue项目开发
- python检测键盘输入_python实时检测键盘输入函数的示例
- 富有哲理的12条大数据金句