Как написать спецификации для эластичного поиска с помощью Rspec - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь написать спецификации для упругого поиска, мой рабочий стек: Ruby 2.3.1, rails 5.0.3, размещенный кластер эластичного поиска (cloud.elastic.co).

Положение

При индексации документов в размещенном кластере добавляются некоторые атрибуты индексации, например, если я индексирую имя моего экземпляра Building (модель Rails), в проиндексированном документе будут имя и имя namekeykeyword. .

Проблема

Я использовал https://github.com/elastic/elasticsearch-ruby/tree/master/elasticsearch-extensions#testcluster для создания тестового кластера до моего пакета rspec и установилasticsearch 6.2.4 с помощью Homebrew (brew install elasticsearch) на моем OSX. Затем я начал писать спецификации, в своем действии контроллера я сортирую по name.keyword, так что запрос выглядит как

{
  query: {
    sort: {
      name: { order: :asc}
    }
  }
}

В этот момент я получаю сообщение об ошибке.

Error

...

Failure/Error: response.headers["count"] = buildings.response.hits.total

 Elasticsearch::Transport::Transport::Errors::BadRequest:
   [400] {"error":{"root_cause":[{"type":"query_shard_exception","reason":"No mapping found for [name.keyword] in order to sort on","index_uuid":"XXqX1-GCQbaHDkhHeTZS5Q","index":"buildings"}],"type":"search_phase_execution_exception","reason":"all shards failed","phase":"query","grouped":true,"failed_shards":[{"shard":0,"index":"buildings","node":"INMaKXXNT5S26JBjhTHUqw","reason":{"type":"query_shard_exception","reason":"No mapping found for [name.keyword] in order to sort on","index_uuid":"XXqX1-GCQbaHDkhHeTZS5Q","index":"buildings"}}]},"status":400}
 Shared Example Group: "authentication" called from ./spec/controllers/user_api/v1/buildings_controller_spec.rb:5
 # /Users/Thomas/.rvm/gems/ruby-2.3.1/gems/elasticsearch-transport-5.0.5/lib/elasticsearch/transport/transport/base.rb:202:in `__raise_transport_error'
 # /Users/Thomas/.rvm/gems/ruby-2.3.1/gems/elasticsearch-transport-5.0.5/lib/elasticsearch/transport/transport/base.rb:319:in `perform_request'
 # /Users/Thomas/.rvm/gems/ruby-2.3.1/gems/elasticsearch-transport-5.0.5/lib/elasticsearch/transport/transport/http/faraday.rb:20:in `perform_request'
 # /Users/Thomas/.rvm/gems/ruby-2.3.1/gems/elasticsearch-transport-5.0.5/lib/elasticsearch/transport/client.rb:131:in `perform_request'
...

Основная часть ошибки: "reason":"No mapping found for [name.keyword] in order to sort on"

1026 * Гипотеза * 1 / Мне нужно написать сопоставление самостоятельно и указать поле name.keyword, но я не уверен, как это сделать 2 / Я должен использовать размещенный тестовый кластер для репликации того же поведения Я думаю, что 1 / может быть подходящим вариантом, но руководства по поиску эластичных инструментов трудно читать, когда говорят об их драгоценных камнях, и я не смог этого сделать. 2 / конечно проще, но мне интересно, не приведет ли это к большему количеству проблем в долгосрочной перспективе (производительность и т. Д.) Документация

https://medium.com/@rowanoulton/testing-elasticsearch-in-rails-22a3296d989 https://github.com/elastic/elasticsearch-rails/issues/69

Любая идея приветствуется!

...