Как интегрировать Elastic Search с Meanjs (Mongodb, Express, Angular, Nodejs)

Я установил MEANJS с grunt . его существующие модули работают правильно. Проблема в том, что я пытаюсь интегрировать эластичный поиск с angular Js. Но не получил никакого правильного решения. Когда я подключаю эластичный поиск к server.js, затем на терминале отображается результат поиска. как отобразить результат поиска через angular 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
    };
}]
 );

person Vipin Singh    schedule 04.11.2014    source источник
comment
Вы не предоставляете достаточно информации или не объясняете конкретную проблему, чтобы можно было помочь. Ознакомьтесь с руководством по вопросам, чтобы получить некоторые советы по этому вопросу.   -  person Matthew Bakaitis    schedule 04.11.2014
comment
Привет, Мэтью, моя проблема заключается в том, как интегрировать эластичный поиск с MEANJS.   -  person Vipin Singh    schedule 04.11.2014
comment
возможный дубликат Пример Angular и Elasticsearch   -  person Manube    schedule 20.05.2015


Ответы (2)


По сути, вы хотите сделать следующее:

  • Запустите сервер Elastic Search (ES).
  • В вашем коде на стороне сервера (MEAN) вы напишете маршрут, который обрабатывает поиск.
  • Сделайте так, чтобы ваш код Angular отправлял запросы на ваш внутренний маршрут, который выполняет поиск через ES.

Вы не хотите, чтобы Angular напрямую общался с ES по сети - насколько я знаю, нет никакого способа сделать это безопасно.

person rdegges    schedule 05.11.2014
comment
привет получил идею, но вы можете предоставить подробное описание с кодом. это будет очень полезно для меня. - person Vipin Singh; 05.11.2014
comment
Я не могу показать какие-либо примеры, так как мне пришлось бы создавать целый сайт, чтобы продемонстрировать то, о чем я говорю :( - person rdegges; 06.11.2014

Привет, наконец-то нашел решение.

Я прикрепил файл 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();
}]
);
person Vipin Singh    schedule 10.11.2014