Node + Elasticsearch入门

为什么要用Elasticsearch?

以前一些简单的搜索功能,我们可以使用sql的查询语句实现,但是随着数据的增大,并且需求的增多,简单的sql查询已经不满足需求,
Elasticsearch的功能:
1,分布式的搜索引擎和数据分析引擎;
2,全文检索,结构化检索,数据分析;
3,对海量数据进行近实时的处理;

Elasticsearch与编程语言交互

Elasticsearch 使用的是标准的 RESTful API 和 JSON。此外,我们还构建和维护了很多其他语言的客户端,例如 Java、Python、.NET、SQL 和 PHP。

安装Elasticsearch

在安装ES之前,我们需要安装java 1.8环境,java 1.8环境安装成功后,我们就可以安装ES了。

MAC环境下安装ES

Mac系统下使用Homebrew安装ES

brew install elasticsearch
Centos下安装ES

切换到安装目录下,例如安装到/usr/share/,ES版本可以自行改变;

$ cd /usr/share/
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.0.tar.gz
$ tar -xvzf elasticsearch-6.5.0.tar.gz
$ cd elasticsearch-6.5.0/
启动ES
$ cd bin/
$ ./elasticsearch

但是你会发现出现下面这个错误
Node + Elasticsearch入门
从错误信息中可以看出,ES不能使用root启动。
解决这个问题方法:
创建一个独立的用户,比如elk来启动elasticsearch,不用root用户启动;

创建用户

创建es用户后切换到es账号,再启动ES

$ useradd es
$ cd /usr/share/
$ chown -R es:es elasticsearch-6.5.0
$ su es
$ cd /usr/share/elasticsearch-6.5.0
$ cd bin/
$ ./elasticsearch -d

注意: -d表示后台运行
查看是否启动成功,ES的默认端口是在9200;启动elasticsearch后,可以访问
http://localhost:9200/,查看是否启动成功。
Node + Elasticsearch入门
出现这个界面表示启动成功。

简单操作
查看集群状态
curl -XGET 'localhost:9200/_cat/health?v&pretty'

Node + Elasticsearch入门

集群的节点列表
curl -XGET 'localhost:9200/_cat/nodes?v&pretty'

Node + Elasticsearch入门

建立索引
curl -H "Content-Type: application/json"  -XPUT 'localhost:9200/books?pretty&pretty'

Node + Elasticsearch入门

列出所有的索引
curl -XGET 'localhost:9200/_cat/indices?v&pretty'

Node + Elasticsearch入门

删除索引
curl -XDELETE 'localhost:9200/books?pretty&pretty'

Node + Elasticsearch入门

实现简单查询

查询书价等于11的数据

curl -H 'Content-Type: application/json' -XGET  'localhost:9200/books/_search?pretty' -d'
{"query": {
    "match": {
        "price": 11
       }
    }
 }'

Node + Elasticsearch入门

Elasticsearch和Node结合使用

创建一个Node.js环境

使用express启动服务。

const express = require('express');
const app = express();
app.get('/', (req, res)=> {
    var responseText = 'Hello world!';
    res.send(responseText);
})
app.listen(3000, ()=> {
    console.log('服务已启动 - 3000');
})
安装elasticsearch模块

弹性搜索为Node.js提供一个官方模块,称为elasticsearch;

yarn add elasticsearch

然后,你可以在脚本里导入模块,如下所示:

const elasticsearch = require('elasticsearch');
使用Node.js建立索引

elasticsearch.js;

...
const elasticsearch = require('elasticsearch');
const esClient = new elasticsearch.Client({
    host: '127.0.0.1:9200',
    log: 'error'
});
const bulkIndex = function bulkIndex(index, type, data) {
let bulkBody = [];

data.forEach(item => {
    bulkBody.push({
        index: {
            _index: index,
            _type: type,
            _id: item.id
        }
    });
    bulkBody.push(item);
});

esClient.bulk({body: bulkBody}).then(response => {
    let errorCount = 0;
    response.items.forEach(item => {
        if (item.index && item.index.error) {
            console.log(++errorCount, item.index.error);
        }
      });
  }).catch(console.err);
};
const test = function test() {
    const books = fs.readFileSync('data.json');
    const book = JSON.parse(books);
    console.log(`${book.length} items parsed from data file`);
    bulkIndex('books', 'book', book);
};
test();
...

运行elasticsearch.js,
Node + Elasticsearch入门

索引建立成功后,可以使用ElasticSearch Toolbox来查看建立的索引;

Node + Elasticsearch入门
好了,今天介绍到这里,下一篇分词查询,未完待续。。。
如果有什么好的建议或者意见请关注公众号

Node + Elasticsearch入门