一般要求
我当前正在使用的系统的一部分是处理原始数据。 每天从多个客户端设备(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;
}
伊丹
翻译自: https://www.javacodegeeks.com/2014/08/my-exprience-using-elasticsearch-nodejs-and-expressjs.html
本文分享了作者使用Elasticsearch、Node.js及ExpressJS进行数据搜索和处理的实践经验。介绍了Elasticsearch的安装配置、数据索引创建、查询操作及与Node.js的集成过程,展示了如何利用ExpressJS搭建RESTful API。


1万+

被折叠的 条评论
为什么被折叠?



