elasticsearch,tire,Ruby On Rails,elasticsearch,Tire" /> elasticsearch,tire,Ruby On Rails,elasticsearch,Tire" />

Ruby on rails 使用轮胎gem为特定字段设置Elasticsearch analyzer

Ruby on rails 使用轮胎gem为特定字段设置Elasticsearch analyzer,ruby-on-rails,elasticsearch,tire,Ruby On Rails,elasticsearch,Tire,我有一个资源对象,它有以下字段:title、description和body 使用轮胎宝石我想使用一个标准的分析仪标题和描述,但身体领域我想使用雪球分析仪 因此,在我的resource.rb文件中,我有以下代码: mapping do indexes :title, type: 'string', :index => :not_analyzed, :store => true indexes :description, type: 'string' indexes :bo

我有一个资源对象,它有以下字段:title、description和body

使用轮胎宝石我想使用一个标准的分析仪标题和描述,但身体领域我想使用雪球分析仪

因此,在我的resource.rb文件中,我有以下代码:

mapping do
  indexes :title, type: 'string', :index => :not_analyzed, :store => true
  indexes :description, type: 'string'
  indexes :body, type: 'string', :analyzer => 'snowball'
end

def self.search(params)
  search_query = params[:query]

  tire.search(page: params[:page], per_page: 15) do |s|
    s.query { string params[:query], default_operator: "AND"} if params[:query].present?
    # do i need another line here specifically for description?
    #s.query { string "body:#{params[:query]}", analyzer: 'snowball'} if params[:query].present?
  end
end
我将映射中的分析器设置为snowball。我验证这是否有效,因为如果我运行以下命令:

curl -XGET localhost:9200/example/_search?q=body:cook
它将返回烹饪、烹饪等

但是,我希望能够通过以下查询

curl -XGET localhost:9200/example/_search?q=cooking
我希望elasticsearch在标题和描述字段中搜索单词cooking,并在正文中搜索单词cook


这可能吗?因为我对整个搜索游戏还不熟悉,这是个好主意吗?还是我只是一个在火坑上摆弄汽油罐的家伙?

当您在查询中没有指定字段时,字段将被搜索。
_all字段包含所有字段的副本,并且使用默认分析器。可以将默认分析器更改为snowball,如中所述,还可以控制哪些字段包含在_all字段中

谢谢伊莫托夫,我看到了那篇帖子。如果我使用该帖子作为参考,我假设如果我将snowball设置为默认分析器,它也将应用于title和description字段。我想我想要的是你提到的第二个选项,即控制哪些字段包含在_all字段中,但是如果我使用这个选项,我还可以通过snowball analyzer定义包含其他字段吗?另外,您是否知道在同一个查询中使用两个分析器的在线数据样本?再次感谢。我明白了,如果你想对不同的字段使用不同的分析器,那么“全部”字段将不适用于你。_all字段基本上是几个字段的副本,它只能使用一个分析器。如果需要不同的分析器,则应该对每个字段使用单独的查询,然后使用或组合这些查询。