Индексирование по полю столбца не работает с 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