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(一)相关推荐

  1. Javascript玩转Prototype(一)——先谈C#原型模式

    在<Javascript玩转继承(二)>中,我使用了原型继承法来实现Javascript的继承,那原型究竟奥秘何在.在这篇文章中,我就主要针对原型来展开讨论. 抛开Javascript,我 ...

  2. JavaScript玩转机器学习:模型转换

    JavaScript玩转机器学习:模型转换 模型转换 TensorFlow.js 配备了各种预训练模型,这些模型可以在浏览器中使用,模型仓库 中有相关介绍.但是,您可能已经在其他地方找到或创建了一个 ...

  3. JavaScript玩转机器学习:Node 中的 TensorFlow.js

    JavaScript玩转机器学习:Node 中的 TensorFlow.js TensorFlow CPU TensorFlow CPU 包,可以按如下方式导入: import * as tf fro ...

  4. JavaScript玩转机器学习:保存并加载 tf.Model

    JavaScript玩转机器学习:保存并加载 tf.Model 保存并加载 tf.Model TensorFlow.js提供了保存和加载模型的功能,这些模型可以是使用LayersAPI创建的或从现有T ...

  5. JavaScript玩转机器学习:​​​​​​​训练模型

    JavaScript玩转机器学习:训练模型 本指南假定您已经阅读了模型和图层指南. 在TensorFlow.js中,有两种方法来训练机器学习模型: 通过LayersModel.fit()或使用Laye ...

  6. JavaScript玩转机器学习:张量(Tensors) 和 操作(operations)

    JavaScript玩转机器学习:张量(Tensors) 和 操作(operations) 张量(Tensors) 和 操作(operations) TensorFlow.js是一个在JavaScri ...

  7. JavaScript玩转机器学习:模型和层

    JavaScript玩转机器学习:模型和层 模型和层 机器学习中,一个 model 是一个带有可训练参数的函数.这个函数将输入转化为输出.通俗的来说,这个函数表达了输入和输出之间的变换关系.我们通过在 ...

  8. 初学者都能学会的ElasticSearch入门实战《玩转ElasticSearch 2》

    大家好,我是咔咔 不期速成,日拱一卒 项目中准备使用ElasticSearch,之前只是对ElasticSearch有过简单的了解没有系统的学习,本系列文章将从基础的学习再到深入的使用. 咔咔之前写了 ...

  9. Javascript玩转继承(一)

    最近一直在学Javascript,打算写一些文章,算做自己的学习心得吧,也可以算是学习笔记.没有系统的知识点,太基础的不想写,主要是写一些自己觉得有价值的地方. 今天写第一篇. Javascript究 ...

最新文章

  1. 一个项目可以有多个源代码路径
  2. wps右键新建里面没有word和excel_WPS竟然出过这么多实用工具?每个都免费无广告,简直相见恨晚...
  3. 按钮的android程序闪退,Android实例化控件有什么特殊要求吗??怎么程序加了这一段之后就闪退。。...
  4. OCP大会 | 腾讯云Open DCN Networking(附PDF)
  5. mysql explain的使用(优化查询)
  6. 多项式的基础操作(逆元/除法/取模/对数ln/开根sqrt/指数exp/快速幂)带模板+luogu全套例题
  7. Kotlin学习笔记30 补充 作用域函数
  8. 5G(1)---5G 协议标准下载
  9. 问题 1020: [编程入门]猴子吃桃的问题
  10. python属于面向对象的还是面向过程的呀-面向过程和面向对象的理解
  11. GPU服务器硬件及软件
  12. 易智瑞大赛——地图故事组参赛经验
  13. 人工智能导论(10)——机器人(Robot)
  14. 动漫系列美化XP主题风暴下载
  15. 天基实业怎样投资理财收益稳定
  16. 百度搜索 屏蔽百家号
  17. 南航计算机科学与技术学院院徽,南京航空航天大学计算机科学与技术学院简介...
  18. 简单hashtab的实现
  19. (二)航空发动机强度与振动复习纲要
  20. Verilog中任务task的使用

热门文章

  1. Python实现Word表格转成Excel表格
  2. 全国计算机一级学科博士点,一级学科博士点高校排名
  3. 300以内的蓝牙耳机哪款好?半入耳蓝牙耳机南卡和漫步者测评
  4. 【经典推荐】10部关于数学的顶级纪录片
  5. 创意h5游戏案例:记忆类H5手机游戏评测
  6. STM32 FSMC 16位寻址 地址移位的解读
  7. android 禁止跟随系统字体,Android 应用全局字体调节或禁止随系统字体大小更改...
  8. qiankun+vue项目开发
  9. python检测键盘输入_python实时检测键盘输入函数的示例
  10. 富有哲理的12条大数据金句