2012-05-30 2 views
5

Я наследую проект, который имеет эластичный поиск по шине.Игнорировать акценты, используя эластичный поиск и шину

Поиск работает, но акценты проходят через него. Поиск «этого» должен вернуть, например, «th» и «thiš».

Я прочитал эту документацию шины: http://karmi.github.com/tire/

Как: http://railscasts.com/episodes/306-elasticsearch-part-1?view=asciicast

Что упоминает, что большинство вариантов упругого поискового запроса доступны в шине.

Searching об игнорировании акцентов, asciifolding подходили, но эластичный поиск только имеет это, чтобы сказать об этом:

http://www.elasticsearch.org/guide/reference/index-modules/analysis/asciifolding-tokenfilter.html

Кроме того, я нашел кое-что о фильтрах/акцентах/и т.д., таких, как эти:

https://github.com/elasticsearch/elasticsearch/issues/890
https://gist.github.com/2142635

Но все они, используя голые упругие параметры поиска.

Когда я пытаюсь использовать фильтр asciifolding в моем коде ruby, я получаю сообщение об ошибке «Фильтр, определяемый для« asciifolding ».

Вот мужество поиска, выполняемого в моем коде, - как я могу изменить это, чтобы выполнить поиск с использованием акцента. Это asciifolding, и если да, то как я объявляю это здесь?

result = tire.search(:load => true,page: params[:page], per_page: params[:per_page]) do 
    query { string "#{params[:term]}", :default_operator => 'and' } if params[:term].present? 
    filter :missing, :field => 'original_media_id' #see above 
    #asciifolding? 
    sort { by :updated_at, :desc } if params[:term].present? 
    facet 'files' do 
    terms 'indexed_files.file.id' 
    end 
end 

EDIT: Или, возможно, это должно было быть сделано при сопоставлении/индексировании? А затем запустите индексатор. Вот отображение, я попытался положить: фильтр => «asciifolding» к некоторым из показателей, но это не похоже на работу (и не генерирует никакого вывода ошибок):

tire.mapping do 
    indexes :id, :index => :not_analyzed 
    indexes :name, :filter => "asciifolding" 
    indexes :description, :filter => "asciifolding" 
    indexes :created_at, :type => 'date' 
    indexes :updated_at, :type => 'date' 
    indexes :file_type 
    indexes :indexed_files, :type => 'object' do 
     indexes :file, :type => 'object', 
      :properties => { 
      :title => { 
      :type => "multi_field", 
       :fields => { 
       :raw => { :type => 'string', :index => 'not_analyzed'}, 
       :title => { :type => 'string', :filter => "asciifolding" } 
       } 
      }, 
      :description => { :type => "string", :filter => "asciifolding" } 
      } 
    end 
end 

ответ

3

Там очень хороший пример из «asciifolding» (удаление акцентов из жетонов при индексировании текста) в этой статье: Autocomplete with Tire