如何修改轮胎过滤器的行为,使它们匹配多个单词

时间:2013-07-02 16:30:09

标签: ruby-on-rails ruby elasticsearch tire

我有一个属于Item模型的Product模型。我想使用Items过滤product.platform。我设置了一个委托方法item.product_platform并为其输出编制了索引。

Tire / ES似乎只过滤了一个单词,只有小写。所以:

item.product_platform = "Nintendo Wii"
filter :term, product_platform: "wii"          # works
filter :term, product_platform: "nintendo"     # works
filter :term, product_platform: "Wii"          # does not work
filter :term, product_platform: "Nintendo"     # does not work
filter :term, product_platform: "nintendo wii" # does not work
filter :term, product_platform: "Nintendo Wii" # does not work

但是当我传入一个精确的字符串时,我希望它返回一个结果,比如“Nintendo Wii”。

这是我的item.rb

  belongs_to :product
  delegate :platform, to: :product, prefix: true

  def self.search(params)
    tire.search do
      query { string params[:query] } if params[:query].present?

      filter :term, product_platform: params[:platform] if params[:platform]
    end
  end

  def to_indexed_json
    to_json(include: :product, methods: :product_platform)
  end

以下是我的映射:

  mapping date_detection: false do
    indexes :id, type: 'integer'
    indexes :user_id, type: 'integer'
    indexes :product_id, type: 'integer'
    indexes :product_platform
  end

1 个答案:

答案 0 :(得分:1)

这是因为elasticsearch会分析并标记您放入索引中的所有内容,除非您另外配置它​​。

取决于您想要过滤的内容,您有以下几种选择:

  1. 使用:index => 'not_analyzed'
  2. 使用:analyzer => 'keyword'
  3. 看看这个问题和喜欢的github问题:using elasticsearch to filter through tags with whitespace