1

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

У меня есть проблема со специальными символами ñ и акцентами áéíóú.

Модель:

class Car 
    ac_field :name, :description, :city, :skip_settings => true 

    def self.ac_search(params, options={}) 
    tire.search load: true, page: params[:page], per_page: 9 do 
     query do 
     boolean do 
      must { string params[:query], default_operator: "AND" } if params[:query].present? 
      must { term :city, params[:city] } if params[:city].present? 
     end 
     end 
     filter :term, city: params[:city] if params[:city].present? 
     facet "city" do 
     terms :city 
     end 
    end 
    end 

end 

Эта версия отлично со специальными символами работает.

т.д .: Запрос с Martin Я получаю все результаты с Martín, martín, martin, Martin

При таком подходе эта проблема:

Теперь какие результаты есть отдельные слова. например Город, отмеченный [«Сан-Франциско», «Мадрид»], будет иметь три отдельных тега. Аналогичным образом, если я делаю запрос на поиск по «san francisco» (должен {term «city», params [: city]}), это провалится, тогда как запрос на «San» или «Francisco» будет успешным. Желаемое поведение здесь заключается в том, что тег должен быть атомарным, поэтому только поиск в тегах «Сан-Франциско» (или «Мадрид») должен быть успешным.

Чтобы устранить эту проблему, я создаю свое собственное отображение:

model = self 
    settings ElasticsearchAutocomplete::Analyzers::AC_BASE do 
    mapping _source: {enabled: true, includes: %w(name description city)} do 
     indexes :name, model.ac_index_config(:name) 
     indexes :description, model.ac_index_config(:description) 
     indexes :city, :type => 'string', :index => :not_analyzed 
    end 
    end 

С этим отображением проблема с многоканальными словами фиксирована, и теперь Гранями с city поля работает отлично:

Вместо того, получение типа San и Francisco Теперь я получаю San Francisco

Теперь проблема в том, что при этом отображении внутри модели поиск не находит результатов со специальным символом ERS

.: например запрос с Martin я получаю результаты только с Martin martin

Я использую Mongoid вместо активной записи.

Как исправить эту проблему? Я думаю, что проблема связана с asciifolding tokenfilter.

+0

вы решить вашу проблему еще? вы подключаете тестовые слова в Ruby или это может быть проблема POST? –

ответ

1

Я исправил проблему с:

class User 
    include Mongoid::Document 
    field :city, :type => String 
    has_one: car 
end 

class Car 
    ac_field :name, :description, :user_city, :skip_settings => true 
    def self.ac_search(params, options={}) 
    tire.search load: true, page: params[:page], per_page: 9 do 
     query do 
     boolean do 
      must { term :user_city, params[:user_city] } if params[:user_city].present? 
     end 
     end 
     facet "cities" do 
     terms :user_city 
     end 
    end 
    end 

    model = self 
    settings ElasticsearchAutocomplete::Analyzers::AC_BASE do 
    mapping _source: {enabled: true, includes: %w(car_city name description)} do 
    indexes :car_city, :type => 'string', :index => :not_analyzed 
    end 
    end 

    def to_indexed_json 
    to_json(methods: [:user_city]) 
    end 
    def user_city 
    user.city 
    end 
end