2016-05-02 3 views
0

Я пытаюсь реализовать функцию автозаполнения, используя Elasticsearch, angularJS и bootstrap.Elasticsearch.js AngularJS autocomplete

Я был вдохновлен этим решением: autocomplete/typeahead angularjs bootstrap on elasticsearch

Это мой Угловая код:

angular.module('cineAngularApp') 
    .service('client', function (esFactory) { 
     return esFactory({ 
      host: 'localhost:9200', 
      apiVersion: '2.2', 
      log: 'trace' 
     }); 
    }); 

angular.module('cineAngularApp') 
.controller('AutocompleteCtrl', function ($scope,client) { 

    $scope.getResult = function(val){ 

     return client.search({ 
      index: 'autocomplete_test', 
      fields: 'city', 
      q: 'city:'+val 
     }).then(function (resp) { 
      var keywords = []; 
      for(var i in resp.hits.hits){ 
       var fields = (resp.hits.hits[i]).fields["city"]; 
       keywords.push(fields); 
      } 
      return keywords; 
     }, function (err) { 
      console.trace(err.message); 
     }); 
    }; 
}); 

Вот моя проблема

Приведенный выше код работает отлично Я использую простой запрос, но как только я меняю запрос, добавив тело он не работает.

angular.module('cineAngularApp') 
.controller('AutocompleteCtrl', function ($scope,client) { 

    $scope.getResult = function(val){ 

     return client.search({ 
      index: 'autocomplete_test', 
      fields: 'city', 
      body: { 
       query: { 
        match: { 
         city: val 
        } 
       } 
      } 
     }).then(function (resp) { 
      var keywords = []; 
      for(var i in resp.hits.hits){ 
       var fields = (resp.hits.hits[i]).fields["city"]; 
       keywords.push(fields); 
      } 
      return keywords; 
     }, function (err) { 
      console.trace(err.message); 
     }); 
    }; 
}); 

Я не знаю, если это может помочь, но я также заметил при отладке, что это не запрос POST больше, но это вариант один.

Заранее за вашу помощь.

+0

в вашем коде у вас есть синтаксис ошибка в ' "запрос": "Название:" + var'. Я не знаю, что это проблема. вы меняете это на «запрос»: «title» + val' и попробуйте. – skal88

+0

Запрос OPTIONS - это ваш предпродажный запрос CORS. Если это не удается, вам нужно ответить соответствующими заголовками CORS на эти запросы. –

ответ

0

Попробуйте с этим:

return client.search({ 
    index: 'movies', 
    "fields": [ "title" ], 
    "body": { // Use body field on elasticsearch client library 
     "query": { 
      "query_string": { 
       "fields": ["title"], 
       "query": "title:"+val 
      } 
     } 
    } 
}).then(function (resp) { 
    // .... 
}) 
+0

Я пробовал ваш код, но он не работал. Когда я добавляю тело, у меня нет результатов вообще. Единственный вопрос, который работает для меня: 'Возвращение client.search ({индекс: 'кино', \t \t \t поля: 'Название', \t \t \t д: 'Название:' + вал}). Затем (функция (соответственно) { // .... }) ' –

Смежные вопросы