#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 и получения их обратно в контроллере.
Мой вопрос
- Какой способ поиска является правильным.
- Порт 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 к своему серверу и нет промежуточных блоков.