使用ElasticSearch NodeJS和ExpressJS的经验

本文分享了作者使用Elasticsearch、Node.js及ExpressJS进行数据搜索和处理的实践经验。介绍了Elasticsearch的安装配置、数据索引创建、查询操作及与Node.js的集成过程,展示了如何利用ExpressJS搭建RESTful API。
摘要由CSDN通过智能技术生成

一般要求

我当前正在使用的系统的一部分是处理原始数据。 每天从多个客户端设备(Android / Iphone设备等)发送的数据约为100,000个请求。
需要收集原始数据,以备将来使用。 它必须可搜索并汇总以进行计算。

我对Solr的经验很少,但是这次我想尝试ElasticSearch(ES)。 我从开箱即用的群集和分片功能中了解了ES,因此给了我一些帮助。

ES

安装简单快捷。 ES附带了舒适的UI仪表板(Marvel)和用于执行查询的命令行工具。

在使用框架之后,我创建了第一个索引和映射类型(MyIndex,MyType)。

那时我还不知道我的数据将如何精确组织,所以我进入了“全域查询”。 这意味着对于一次输入搜索,ES引擎将遍历所有文档并在每个文档的字段中进行搜索。 匹配的文档将返回。

我们可以通过使用字段_all来实现。 该字段包括索引文档中一个或多个其他字段的拼合文本。 默认情况下(如果启用)填充该字段。

查询非常简单:

GET /_search
{
    "match": {
        "_all": "Android Galaxy S5 device"
    }
}

ES仪表板还附带了一个名为Sense的工具。 使用此工具,您可以直接在ES中索引和执行查询,而无需使用任何客户端(这对于测试和开发目的非常有用)。

我建议您进行抛出映射,分析,增强,别名等等。

节点JS

因此,在玩完ES之后,我决定将服务器端层写为我的ES外观。

我的意图是编写带有单个搜索行的简单客户端,该搜索行将通过服务器层向ES发送请求,并将结果呈现到屏幕上。

ES正在使用Json's作为其输入和输出。 我考虑过使用与json兼容的javascript。

Nodejs是服务器端层,也使用JS语法。 这就是JavaScript使Node成为与ElasticSearch交互的理想语言的原因。 数字?

我抓住了NodeJS的ES客户端实现(elasticsearchclient),并在编码后完成了Node与ES之间的集成。 这是来自节点端的示例代码,用于查询ES:

var index = "myindex";
var type = "mytype";
ElasticSearchClient = require('elasticsearchclient');
var Q = require('q');


var serverOptions = {
    host: 'localhost',
    port: 9200
};

var elasticSearchClient = new ElasticSearchClient(serverOptions);

function performSearch(termToSearch) {

    var deferred = Q.defer();
    console.log("Request handler 'search' was called.");
    var qryObj = {
        "query" : {
            "term" : { "name":termToSearch }
        }
    };
    elasticSearchClient.search(index, type, qryObj).
        on('data', function (data) {
            // console.log(data)
            deferred.resolve(JSON.parse(data));
        })
        .on('error', function (err) {
            console.log(err);
            return deferred.resolve(err);
        })
        .exec();
    return  deferred.promise;
}

exports.performSearch = performSearch;

NodeJS是使用事件循环程序实现的单线程。 因此,“繁重”的逻辑需要异步执行。 我在代码中使用Q。
Q是一个用于在JavaScript中创建和编写异步Promises的库。

这样,我可以“释放”事件循环器,并创建对我的ES引擎的异步请求,并使用Q通过代码层获得干净的回调。

一段时间后,我发现需要广泛的API。 我为此使用ExpressJS。

ExpressJS

我希望MVC框架提供类似rest-api的层,以处理服务器端(NodjeJS)中的所有API请求。

我去了ExpressJS,它似乎是Web开发人员中最流行的Node.js Web框架(作为经验丰富的开源开发人员,我们知道社区很重要!)。

我沉迷于项目结构。 我来自Java世界,有时JavaScript项目在我看来像丛林。 我一直在寻找一种流行的传统方式来与ExpressJS一起构建NodeJS项目。

因此,在使用该框架之后,我发现使用Yeoman和generator-express可以快速生成Nodejs的项目结构,包括所有必要的expressJS库以助您一臂之力。

我的项目树如下所示:

节点树

ExpressJS控制器示例:

var express = require('express');
var router = express.Router();
var esService = require('../services/esService');
var Q = require('q');



router.get("/search", function (req, res) {
    var termToSearch = req.query.termToSearch;
    console.log("termToSearch=" + termToSearch);
    Q(esService.performSearch(termToSearch)
    ).then(function (data) {
            res.send("Session: %j", data);
        });
})

控制器使用esService调用perfomSearch方法,然后使用promise将结果异步返回到JS客户端。

这是JS客户端代码,将结果呈现为HTML元素:

*我使用prettyPrint库在屏幕上很好地打印了json结果:

function handleClick() {
    var inputParam = document.querySelector("#myinput").value;
    $.get('http://localhost:3000/search?termToSearch=' + inputParam, function (responseText) {
        console.log(responseText);
        $("#resultlist").append(prettyPrint(responseText));
    });

    return false;
}


es

伊丹

翻译自: https://www.javacodegeeks.com/2014/08/my-exprience-using-elasticsearch-nodejs-and-expressjs.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值