【问题标题】:tire and elasticsearch_autocomplete accents and facets轮胎和弹性搜索_自动完成口音和方面
【发布时间】:2013-09-30 23:31:35
【问题描述】:

我正在使用 elasticsearch_autocomplete gem 来实现自动完成功能。

我对特殊字符 ñ 和重音符号 áéíóú 有疑问。

型号:

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", "Madrid"] 的城市最终将拥有三个单独的标签。同样,如果我对“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 字段的方面可以正常工作:

而不是获取类型方面 SanFrancisco 现在我得到 San Francisco

现在的问题是,使用模型内部的这种映射,搜索不会找到带有特殊字符的结果

例如:使用Martin 查询我只得到Martin martin 的结果

我正在使用 mongoid 而不是活动记录。

我该如何解决这个问题?我认为问题出在asciifolding tokenfilter

【问题讨论】:

  • 您的问题解决了吗?您是在 Ruby 中插入测试词还是可能是 POST 问题?

标签: ruby-on-rails ruby-on-rails-3 autocomplete elasticsearch tire


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多