Индексирование по полю столбца не работает с ElasticSearch

Я реализую интеграцию ElasticSearch в моей модели:

require 'elasticsearch/model'
class MissionDef < ActiveRecord::Base
  # field: name (String(40))
  # field: icon (String(2000))
  # field: definition (String)
  # field: public, boolean

  include Elasticsearch::Model
  include Elasticsearch::Model::Callbacks

  def as_indexed_json(options={})
    self.as_json(
     only: [:id, :name]
     )
  end
end

и в моей консоли Rails я сделал:

MissionDef.import

MissionDef.first

MissionDef id: 226, ade_channel_key: "d403d658313e6c35ce", name: "Test Mission", icon: "/app/assets/images/badges/Showedup.png", definition: "{}", deleted_at: nil, created_at: "2015-08-04 11:30:08", updated_at: "2015-08-04 11:30:08", container_id: 883, public: true

Мой запрос

1) когда я выполняю поиск с другим значением поля, отличным от name и id, которое не проиндексировано, это дает мне результат поиска. например:

result = MissionDef.search 'app' --- это работает result.records.count => 1

что не должно быть так, я думаю.

2) Missiondef.first.as_indexed_json => не работает должным образом, это дает мне o/p как весь объект как JSON

{"id" => 226, "ade_channel_key" => "d403d658313e6c35ce", "name" => "Тестовое задание", "icon"=>"/app/assets/images/badges/Showedup.png", "Definition"=>"{}", "creation_at"=> Вт, 04 августа 2015 г. 11:30:08 UTC +00:00, "updated_at"=> Вт, 04 августа 2015 г. 11:30:08 UTC +00:00, "container_id"=>883, "public"=>true}

1 ответ

Я не использовал elasticsearch-rails gem раньше, но по умолчанию я знаю, что asticsearch будет искать целые документы, поэтому, если вы хотите указать только определенные поля в вашем запросе. Итак, в приведенном вами примере app соответствует значку поля: /app/assets/images/badges/Showedup.png

Попробуйте указать поля, которые вы хотите найти - читайте больше в их документации здесь: https://github.com/elastic/elasticsearch-rails/blob/master/elasticsearch-model/README.md#the-elasticsearch-dsl

Так что в этом случае это может быть что-то вроде:

result = MissionDef.search query: {match:  {name: "app" }}
result.records.count #=> should be 0 this time
Другие вопросы по тегам