ElasticSearch with Tire не включает собственный анализатор с моделью STI.

У меня есть модель STI, которую я хочу найти с помощью ElasticSearch и Tire. Проблема, с которой я сталкиваюсь, заключается в том, что когда Tire создает сопоставления, он, кажется, игнорирует мои пользовательские анализаторы для второй модели. Ниже пример моих моделей.

class Account < ActiveRecord::Base
  attr_accessible :name, :type

  include Tire::Model::Search
  include Tire::Model::Callbacks

  tire.settings :analysis => {
          :analyzer => {
          "custom_search_analyzer" => {
              "tokenizer" => "keyword",
              "filter" => "lowercase"
          },
          "custom_index_analyzer" => {
              "tokenizer" => "keyword",
              "filter" => ["lowercase","substring"]
          }
      },
      :filter => {
          :substring => {
              "type" => "nGram",
              "min_gram" => 1,
              "max_gram" => 20
          }
      }
  } do
    mapping do
      indexes :id, :type => 'integer', :include_in_all => false
      indexes :name, :type => 'string', :search_analyzer => :custom_search_analyzer,     :index_analyzer=>:custom_index_analyzer
    end
  end

  def to_indexed_json
    hash = {}
    hash[:id] = id
    hash[:name] = name
    hash.to_json
  end
end

class StandardAccount < Account
  tire.index_name 'accounts'
end

class SuperAccount < Account
  tire.index_name 'accounts'
end

Когда я создаю индекс через шину, либо с помощью задачи rake, либо путем создания модели, он создает сопоставления, но для унаследованных моделей он не применяет к ним пользовательские анализаторы. Если я посмотрю на сопоставления, используя

curl -XGET 'http://127.0.0.1:9200/accounts/_mapping?pretty=1'  

Я получил:

{
  "accounts" : {
    "account" : {
      "properties" : {
        "id" : {
          "type" : "integer",
          "include_in_all" : false
        },
        "name" : {
          "type" : "string",
          "index_analyzer" : "custom_index_analyzer",
          "search_analyzer" : "custom_search_analyzer"
        }
      }
    },
    "standard_account" : { 
      "properties" : {
        "id" : {
          "type" : "long"
        }
        "name" : {
          "type" : "string"
        }
      }
    },
    "super_account" : {
      "properties" : {
        "id" : {
          "type" : "long"
        }
        "name" : {
          "type" : "string"
        }
      }
    }
  }
}

Даже если я перенесу объявления сопоставления в унаследованные классы, кажется, что только первая созданная модель получает дополнительные параметры. Я могу вручную создать индексы через ElasticSearch, но мне интересно, есть ли способ сделать это с помощью Tire? Или я что-то не так настроил


person user1340515    schedule 15.03.2013    source источник


Ответы (1)


Возможно, вы уже нашли ответ, но я думаю, что это может помочь вам или другим людям, имеющим ту же проблему:

https://stackoverflow.com/a/13660263/1401343

-Влад

person vburca    schedule 14.06.2013