Я пытаюсь написать спецификации для упругого поиска, мой рабочий стек:
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
Любая идея приветствуется!