эластичный поиск с помощью angularjs или node js

#javascript #angularjs #node.js #elasticsearch

#javascript #angularjs #node.js #эластичный поиск

Вопрос:

Я работаю над приложением MEAN stack, которое также использует 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 отдельно.Я имею в виду не через поток моего веб-сайта (относительный путь).

Спасибо за помощь.

Комментарии:

1. Ваше клиентское приложение должно передавать запросы (или, что еще лучше, просто параметры) вашему Node.js сервер для запуска. Ваша база данных никогда не должна предоставляться клиентам напрямую.

2. Спасибо @joews за ответ. Я сделаю это на стороне сервера.

Ответ №1:

Порт 9200 предназначен для доступа к их API, когда вы вызываете их RESTful API, вы используете этот порт, поскольку вы сказали, что вам запрещено использовать порт 9200, другой способ связаться с elasticsearch — использовать транспортный клиент, который работает на порту 9300. Я не уверен, что Node.js можно использовать транспортный клиент, но на стороне сервера вы можете использовать spring data или java client.

Взгляните на ссылку ниже

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

Ответ №2:

подключите эластичный поиск с помощью 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

Ответ №3:

Прежде всего, вы никогда не должны открывать порт 9200 для общего доступа в вашей производственной среде. Вы просто позволяете любому запускать запросы непосредственно к вашей базе данных. Любой может удалить ваш elasticsearch из памяти или просто удалить все ваши данные. Это может привести к хаосу. Таким образом, порт 9200 должен быть всегда заблокирован на box.
Еще одна причина, по которой ваши NodeJS должны взаимодействовать с ES и предоставлять их как API, заключается в том, что ваше приложение будет отделено от вашего сервера. Таким образом, вы можете легко повторно использовать те же API, если хотите создать любое мобильное приложение. В противном случае ваша клиентская логика будет тесно связана, и вы будете повсюду повторять множество кодов. А больше кода означает больше обслуживания и больше ошибок.
Итак, вы должны взаимодействовать со своим сервером NodeJS, а ваш сервер должен взаимодействовать с elasticsearch. Опять же, эта конфигурация будет зависеть от того, как расположены ваши блоки и как они взаимодействуют друг с другом, в случае, если ваше приложение nodejs и elasticsearch находятся в разных блоках.

Для локального тестирования я обычно сопоставляю свой порт 9200 с портом 9200 разработчиков, используя ssh. Это дает мне ощущение наличия ES в моей системе. Опять же, это сработает, только если вы можете напрямую подключиться по ssh к своему серверу и нет промежуточных блоков.