具有angularjs或节点js的elasticsearch

时间:2016-10-19 18:26:29

标签: javascript angularjs node.js elasticsearch

我正在研究MEAN堆栈应用程序,它也使用elasticsearch来搜索记录。我使用angularJS控制器中的以下代码来调用elasticsearch服务器

instantResult: function(term) {
var client = elasticsearch({
            host: $location.host() + ':9200'
        });
        var deferred = $q.defer();
        client.search({ 
//Query here

}).then(function(result) {
                var hits = result.hits.hits;
                deferred.resolve(hits);
            },
            function(err) {
                console.trace(err.message);
            }, deferred.reject);
        return deferred.promise;
}

这里我们从客户端调用elasticsearch服务器。

我上面所做的相同功能可以通过Node Js(即服务器端)通过使用rest调用传递数据并在控制器中接收它来实现。

我的问题是

  1. 哪种搜索方式正确。
  2. 端口9200被许多组织阻止,所以我无法获得搜索结果。通过上面代码中显示的客户端搜索,我正在访问该主机:9200单独。我的意思是不通过我的网站的流程(相对路径)。
  3. 感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

端口9200是访问他们的API,当你调用他们使用该端口的RESTFUl API时,因为你说你被阻止使用9200端口,另一种与elasticsearch交谈的方法是使用在9300端口上运行的传输客户端。我不确定Node.js是否可以使用传输客户端,但在服务器端,您可以使用spring数据或Java客户端。

请看下面的链接

http://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/

答案 1 :(得分:0)

使用AngularJS连接弹性搜索,如下所示。

第1步: - 创建新的app.js文件

var app = angular.module('testApp', ['elasticsearch']);

app.factory('elasticClient', ['esFactory', function (esFactory) {
    return esFactory({
       host: 'http://localhost:9200',
       sniffOnStart: true,
       sniffInterval: 300000
    });
}]);

第2步: - 在控制器使用下面的代码

app.controller('mainController', function ($scope, elasticClient) {
$scope.results = [];
$scope.search = {
    queryTerm: ''
};

$scope.search = function () {
    elasticClient.search({
        index: 'books',
        size: 20,
        body: {
            'query': {
                'query_string': {
                    'query': $scope.search.queryTerm
                }
            }
        }
    }).then(function (response) {
        $scope.results = response.hits.hits;
    });   
}
});

看一看 https://github.com/vhvinod/AngularJS-ElasticSearch

答案 2 :(得分:0)

首先,您不应该在生产环境中将端口9200打开到公共端。您只是让任何人直接向您的数据库发出查询。任何人都可以将弹性搜索内存推出内存或只是下拉所有数据。这可能会导致严重破坏。因此,端口9200应始终在框中被阻止。
使nodeJS与ES通信并将其作为API公开的另一个原因是您的应用程序将与您的服务器分离。因此,如果要构建任何移动应用程序,可以轻松地重用相同的API。否则,您的客户端逻辑将紧密耦合,您将在各处重复许多代码。更多的代码意味着更多的维护和更多的错误 因此,您应该与您的nodeJS服务器通信,您的服务器应该与elasticsearch交谈。同样,这种配置将取决于您的盒子如何排列和相互通信,以防您的nodejs应用程序和弹性搜索位于不同的盒子上。

为了在本地进行测试,我通常使用ssh将我的端口9200映射到dev ES端口9200。这让我觉得我的系统上有ES。只有当你可以直接ssh到你的服务器并且没有中间框时,这才会起作用。