小言_互联网的博客

Elasticsearch:Elasticsearch 开发入门 - Nodejs

364人阅读  评论(0)

在本文中,我将分享如何在 Node.js 中如何使用 Elasticsearch 来开发的经验。 顺便说一句,以防万一你从未听说过 Elasticsearch:

Elasticsearch 是一个高度可扩展的开源全文本搜索和分析引擎。 它使你可以快速,近乎实时地存储,搜索和分析大量数据。 它通常用作支持具有复杂搜索功能和要求的应用程序的基础引擎/技术。

如果你想了解更多关于 Elasticsearch 的介绍,你可以参阅我之前的文章 “Elasticsearch 简介”。

 

前提条件

  1. 你需要在你的电脑上安装 nodjs 8.9.4 或以上的版本
  2. 你需要安装 docker 18.03.0-ce 或以上的版本

 

创建 nodejs 项目

首先我们来创建一个叫做 node-elasticsearch 的目录,并进入该目录:


  
  1. make node-elasticsearch
  2. cd node-elasticsearch

执行 npm init 生成 package.json 文件。 我为强制创建模式添加了 -f 标志:

我们把生成的 package.json 的 scripts 部分修改为启动 index.js:

package.json


  
  1. {
  2. "name": "node-elasticsearch",
  3. "version": "1.0.0",
  4. "description": "",
  5. "main": "index.js",
  6. "scripts": {
  7. "start": "node index.js"
  8. },
  9. "keywords": [],
  10. "author": "",
  11. "license": "ISC",
  12. "dependencies": {
  13. "elasticsearch": "^16.7.2"
  14. }
  15. }

然后从 npm 安装 Elasticsearch 软件包。 很高兴看到我们有 Node.js 的官方软件包。

npm install elasticsearch

我们的 node.js 设置已准备就绪。

这样我们就安装好了 elasticsearch 包。接下来,我们将安装 Elasticsearch。

安装 Elasticsearch 及 Kibana

如果你之前从来没有安装过 Elasticsearch 或 Kibana。你可以阅读我之前的文章 “Elastic:菜鸟上手指南” 来进行安装。在本练习中,我们将使用 docker 来安装 Elasticsearch 及 Kibana。我们首先来创建一个叫做 docker-compose.yml 的文件:

docker-compose.yml


  
  1. ---
  2. version: "3"
  3. services:
  4. elasticsearch:
  5. image: docker.elastic.co/elasticsearch/elasticsearch:7.10.0
  6. container_name: es01
  7. environment:
  8. - node.name=es01
  9. - cluster.name=docker-cluster
  10. - bootstrap.memory_lock=true
  11. - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
  12. - discovery.type=single-node
  13. ulimits:
  14. memlock:
  15. soft: -1
  16. hard: -1
  17. volumes:
  18. - esdata:/usr/share/elasticsearch/data
  19. ports:
  20. - 9200 :9200
  21. kibana:
  22. image: docker.elastic.co/kibana/kibana:7.10.0
  23. ports:
  24. - 5601 :5601
  25. depends_on:
  26. - elasticsearch
  27. volumes:
  28. esdata:
  29. driver: local

在上面,我们使用了 Elastic Stack 7.10.0 发行版作为实验的版本。在你实际的使用中,你可以根据自己的版本需求而进行修改。

我们必须先启动 docker,然后在命令行中执行:

docker-compose up

上面命令必须执行于 docker-compose.yml 文件所在的目录中。

它将启动 http://localhost:9200 中的 Elasticsearch 和 http://localhost:5601 中的 Kibana。 你可以通过在浏览器中打开链接来进行验证。

 

连接到 Elasticsearch

我们接下来创建一个叫做 index.js 的文件,并输入一下的内容:

index.js


  
  1. const es = require( 'elasticsearch');
  2. const client = es.Client({ host: 'http://localhost:9200' });
  3. client.ping()
  4. .then( res => console.log( 'connection success', res))
  5. .catch( err => console.error( 'wrong connection', err));

代码真的很简单。 我们导入我们的 Elasticsearch 模块并创建一个针对 Elasticsearch 主机的客户端对象。 最后,我们使用 ping 方法验证我们的 Elasticsearch 连接是否成功。 如果成功,它将返回 true。


  
  1. $ npm start
  2. > node-elasticsearch@ 1.0 .0 start / Users/liuxg/nodejs/node-elasticsearch
  3. > node index.js
  4. connection success true

创建索引

Elasticsearch 中的索引是文档的集合。 术语文档广泛用于表示 Elasticsearch 中的数据。 我们将创建一个名为 student 的索引来存储学生列表。 一个重要的规则,索引名称必须小写。在 http://localhost:5601 中打开 Kibana,然后单击开发工具菜单。 然后,在 “Console” 选项中,使用下面的命令,然后单击绿色的播放按钮创建索引。

 

插入文档

现在,从我们的项目中,让我们尝试插入一些学生文档。

index.js


  
  1. const es = require( 'elasticsearch');
  2. const client = es.Client({ host: 'http://localhost:9200' });
  3. client.ping()
  4. .then( res => console.log( 'connection success', res))
  5. .catch( err => console.error( 'wrong connection', err));
  6. client.index({
  7. index: 'students',
  8. type: '_doc',
  9. body: {
  10. name: 'John Doe',
  11. age: 17,
  12. hobby: 'basketball'
  13. }
  14. })
  15. .catch( err => console.error(err));

我们接着执行:

npm start

我们使用 index 方法,并指定索引名称,类型(您无需过多考虑是什么 type,因为在将来的 Elasticsearch 版本中不再使用该类型)和学生信息。
通过输入以下命令,验证在 Kibana 中的创建。

GET students/_search

学生信息存储在 hits 中。 我们还会在 _id 字段中获得自动生成的 ID。 这是因为我们不为学生提供 ID,因此 Elasticsearch 会慷慨地为我们生成 ID。
这是有关在创建文档时如何提供 ID 的示例。 看一下 id 字段。

index.js


  
  1. const es = require( 'elasticsearch');
  2. const client = es.Client({ host: 'http://localhost:9200' });
  3. client.ping()
  4. .then( res => console.log( 'connection success', res))
  5. .catch( err => console.error( 'wrong connection', err));
  6. client.index({
  7. index: 'students',
  8. type: '_doc',
  9. id: 1,
  10. body: {
  11. name: 'C. Ronaldo',
  12. age: 33,
  13. hobby: 'football'
  14. }
  15. })
  16. .catch( err => console.error(err));

重新执行:

npm start

我们将发行有多一个 _id 为 1 的文档。到目前为止,我们有两个文档了。

你可能还会注意到每个文档的响应中的 _score 字段。 这是出于搜索目的。 分数越高意味着文档越相关

 

获取文档

要从我们的项目中获取学生文档,我们可以使用搜索方法。

index.js


  
  1. const es = require( 'elasticsearch');
  2. const client = es.Client({ host: 'http://localhost:9200' });
  3. client.ping()
  4. .then( res => console.log( 'connection success', res))
  5. .catch( err => console.error( 'wrong connection', err));
  6. client.search({
  7. index: 'students',
  8. type: '_doc',
  9. })
  10. .then( res => console.log( JSON.stringify(res)))
  11. .catch( err => console.error(err));

重新运行上面的 index.js 文件:


  
  1. $ npm start
  2. > node-elasticsearch@ 1.0 .0 start / Users/liuxg/nodejs/node-elasticsearch
  3. > node index.js
  4. connection success true
  5. { "took": 1, "timed_out": false, "_shards":{ "total": 1, "successful": 1, "skipped": 0, "failed": 0}, "hits":{ "total":{ "value": 2, "relation": "eq"}, "max_score": 1, "hits":[{ "_index": "students", "_type": "_doc", "_id": "Fzr0hHYBUxQeTRscd3yG", "_score": 1, "_source":{ "name": "John Doe", "age": 17, "hobby": "basketball"}},{ "_index": "students", "_type": "_doc", "_id": "1", "_score": 1, "_source":{ "name": "C. Ronaldo", "age": 33, "hobby": "football"}}]}}

我们的回应与我们在 Kibana 中的响应相同。

 

搜索文档

这是 Elasticsearch中 最重要的功能。 由于我们已经有两个文档,因此我们可以尝试搜索。 我们仍然使用 search 方法来获取文档,但是现在我们定义了一个查询。 该查询将确定每个文档的分数。

index.js


  
  1. const es = require( 'elasticsearch');
  2. const client = es.Client({ host: 'http://localhost:9200' });
  3. client.ping()
  4. .then( res => console.log( 'connection success', res))
  5. .catch( err => console.error( 'wrong connection', err));
  6. client.search({
  7. index: 'students',
  8. type: '_doc',
  9. body: {
  10. query: {
  11. match: { name: 'John' }
  12. }
  13. }
  14. })
  15. .then( res => console.log( JSON.stringify(res)))
  16. .catch( err => console.error(err));

  
  1. $ npm start
  2. > node-elasticsearch@ 1.0 .0 start / Users/liuxg/nodejs/node-elasticsearch
  3. > node index.js
  4. connection success true
  5. { "took": 1, "timed_out": false, "_shards":{ "total": 1, "successful": 1, "skipped": 0, "failed": 0}, "hits":{ "total":{ "value": 1, "relation": "eq"}, "max_score": 0.6931471, "hits":[{ "_index": "students", "_type": "_doc", "_id": "Fzr0hHYBUxQeTRscd3yG", "_score": 0.6931471, "_source":{ "name": "John Doe", "age": 17, "hobby": "basketball"}}]}}

由于 name 与查询匹配,因此我们将会获得如上所示的名字叫做 John 的文档。

在 Kibana 中的等效 Elasticsearch 命令:

Elasticsearch 有很多搜索配置,你可以稍后进行调整。如果你对这个感兴趣的话,请阅读我之前的文章 “开始使用Elasticsearch (2)”。

 

更新文档

假设我们要更新 ID 为 1 的学生的爱好。

index.js


  
  1. const es = require( 'elasticsearch');
  2. const client = es.Client({ host: 'http://localhost:9200' });
  3. client.ping()
  4. .then( res => console.log( 'connection success', res))
  5. .catch( err => console.error( 'wrong connection', err));
  6. client.update({
  7. index: 'students',
  8. type: '_doc',
  9. id: '1',
  10. body: {
  11. doc: {
  12. hobby: 'swimming'
  13. }
  14. }
  15. })
  16. .then( res => console.log( JSON.stringify(res)))
  17. .catch( err => console.error(err));

运行上面的代码。


  
  1. $ npm start
  2. > node-elasticsearch@ 1.0 .0 start / Users/liuxg/nodejs/node-elasticsearch
  3. > node index.js
  4. connection success true
  5. { "_index": "students", "_type": "_doc", "_id": "1", "_version": 2, "result": "updated", "_shards":{ "total": 2, "successful": 1, "failed": 0}, "_seq_no": 2, "_primary_term": 1}

这是我们更改爱好后的更新文档:


  
  1. {
  2. "_index" : "students",
  3. "_type" : "_doc",
  4. "_id" : "1",
  5. "_version" : 2,
  6. "_seq_no" : 2,
  7. "_primary_term" : 1,
  8. "found" : true,
  9. "_source" : {
  10. "name" : "C. Ronaldo",
  11. "age" : 33,
  12. "hobby" : "swimming"
  13. }
  14. }

 

删除一个文档

delete 命令非常简单:

index.js


  
  1. const es = require( 'elasticsearch');
  2. const client = es.Client({ host: 'http://localhost:9200' });
  3. client.ping()
  4. .then( res => console.log( 'connection success', res))
  5. .catch( err => console.error( 'wrong connection', err));
  6. client.delete({
  7. index: 'students',
  8. type: '_doc',
  9. id: '1'
  10. })
  11. .then( res => console.log( JSON.stringify(res)))
  12. .catch( err => console.error(err));

运行上面的代码:


  
  1. $ npm start
  2. > node-elasticsearch@ 1.0 .0 start / Users/liuxg/nodejs/node-elasticsearch
  3. > node index.js
  4. connection success true
  5. { "_index": "students", "_type": "_doc", "_id": "1", "_version": 3, "result": "deleted", "_shards":{ "total": 2, "successful": 1, "failed": 0}, "_seq_no": 3, "_primary_term": 1}

如果我们现在到 Kibana 中重新进行查看的话,那么我们会发现只剩下一个文档了。

 

结论

Elasticsearch 是用于搜索和分析数据的强大强大引擎。如果你想了解更多,请阅读我的文章 “Elastic:菜鸟上手指南”。


转载:https://blog.csdn.net/UbuntuTouch/article/details/111479983
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场