我已经安装了MEANJS和grunt。它现有的模块正常运行。问题是我试图将弹性搜索与角度Js集成。但没有得到任何正确的解决方案。当我将弹性搜索连接到server.js。然后在终端上显示搜索结果。如何通过主页上的角度js显示搜索结果。
我还想将弹性数据库与mongodb数据库连接,以便弹性搜索自动更新。任何建议对我都很有帮助。 通过弹性搜索连接我正在使用
var MyOpenRecipes = angular.module('myOpenRecipes', ['elasticsearch'],
['$locationProvider', function($locationProvider){
$locationProvider.html5Mode(true);
}]
);
MyOpenRecipes.factory('recipeService',
['$q', 'esFactory', '$location', function($q, elasticsearch, $location){
var client = elasticsearch({
host: $location.host() + ":9200"
});
/**
* Given a term and an offset, load another round of 10 recipes.
*
* Returns a promise.
*/
var search = function(term, offset){
var deferred = $q.defer();
var query = {
"match": {
"_all": term
}
};
client.search({
"index": 'facilities',
"type": 'facility',
"body": {
"size": 10,
"from": (offset || 0) * 10,
"query": query
}
}).then(function(result) {
var ii = 0, hits_in, hits_out = [];
hits_in = (result.hits || {}).hits || [];
for(;ii < hits_in.length; ii++){
hits_out.push(hits_in[ii]._source);
}
deferred.resolve(hits_out);
}, deferred.reject);
return deferred.promise;
};
return {
"search": search
};
}]
);
答案 0 :(得分:3)
基本上你想要做的是:
你不想让Angular通过网络与ES直接对话--AFAIK那里无法安全地做到这一点。
答案 1 :(得分:0)
你好,终于得到了解决方案。
我附上了elastic.angular.js文件/var/www/meanjs/config/env/all.js
并在/var/www/meanjs/public/modules/core/controllers/home.client.controller中。我已经编写了以下代码,并且搜索工作顺利。
angular.module('core').factory('recipeService',
['$q', 'esFactory', '$location', function($q, elasticsearch, $location){
var client = elasticsearch({
host: $location.host() + ':9200'
});
/**
* Given a term and an offset, load another round of 10 recipes.
*
* Returns a promise.
*/
var search = function(term, offset){
var deferred = $q.defer();
var query = {
'match': {
'_all': term
}
};
client.search({
'index': 'facilities',
'type': 'facility',
'body': {
'size': 10,
'from': (offset || 0) * 10,
'query': query
}
}).then(function(result) {
var ii = 0, hits_in, hits_out = [];
hits_in = (result.hits || {}).hits || [];
for(;ii < hits_in.length; ii++){
hits_out.push(hits_in[ii]._source);
}
deferred.resolve(hits_out);
}, deferred.reject);
return deferred.promise;
};
return {
'search': search
};
}]
);
angular.module('core').controller('recipeCtrl',
['recipeService', '$scope', '$location', function(recipes, $scope, $location){
// Provide some nice initial choices
var initChoices = [
'ADS AMBULATORY SURGERY CTR',
'NOVAMED EYE SURGERY CENTER OF OVERLAND PARK',
'DISCOVER VISION SURGERY & LASER CENTER LLC',
'HUTCHINSON AMBULATORY SURGERY CENTER LLC',
'SHAWNEE MISSION PRAIRIE STAR SURGERY CENTER LLC',
'LASER CENTER',
'QUINLAN EYE SURGERY & LASER CENTER',
'ADS AMBULATORY SURGERY CTR'
];
var idx = Math.floor(Math.random() * initChoices.length);
// Initialize the scope defaults.
$scope.recipes = []; // An array of recipe results to display
$scope.page = 0; // A counter to keep track of our current page
$scope.allResults = false; // Whether or not all results have been found.
// And, a random search term to start if none was present on page load.
$scope.searchTerm = $location.search().q || initChoices[idx];
/**
* A fresh search. Reset the scope variables to their defaults, set
* the q query parameter, and load more results.
*/
$scope.search = function(){
$scope.page = 0;
$scope.recipes = [];
$scope.allResults = false;
$location.search({'q': $scope.searchTerm});
$scope.loadMore();
};
/**
* Load the next page of results, incrementing the page counter.
* When query is finished, push results onto $scope.recipes and decide
* whether all results have been returned (i.e. were 10 results returned?)
*/
$scope.loadMore = function(){
recipes.search($scope.searchTerm, $scope.page++).then(function(results){
if(results.length !== 10){
$scope.allResults = true;
}
var ii = 0;
for(;ii < results.length; ii++){
$scope.recipes.push(results[ii]);
}
});
};
// Load results on first run
$scope.loadMore();
}]
);