使用ElasticSearch对具有不同区域设置的字段进行排序

时间:2012-09-13 11:20:49

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

在项目中,需要通过存储在不同语言环境中的一个字段对记录进行排序。是)我有的: 表“公司”,没有名为“name”的字段,但有一个表:

create_table "company_localizations" do |t|
  t.integer "company_id"
  t.string "locale"
  t.string "name"
  ...
end

我有索引company.rb:

mapping do
  indexes :name, :type => "multi_field",
    :fields => {
       :name => {:type => "string", :index => "analyzed"},
       :name_sort => {:type => "string", :index => "not_analyzed"}
    }
end

我需要对这个领域进行排序。我正在使用ElasticSearch和Tire gem。

2 个答案:

答案 0 :(得分:0)

在Tire中,使用

sort { by "name.name_sort" }

在你的情况下。您的示例中不需要name_前缀 - 没有它,您可以将您的字段称为name.sort

有关详细信息,请参阅https://github.com/karmi/tire/blob/master/test/integration/sort_test.rb和其他集成测试。

答案 1 :(得分:0)

我有一个非常奇怪的弹性动作,但它没有对multi_filed类型进行排序。有一个问题,在应用程序中它可能是英语语言环境中的俄语符号和数据库中俄语语言环境中的英语符号,因此它没有使用multi_filed类型排序...我已成功将multi_filed更改为嵌套以这种方式:

settings :analysis => {
  :analyzer => {
    :sort_analyzer => {
      "tokenizer" => "keyword",
      "filter" => ["lowercase"]
    }
  }
}

mapping do
  indexes :name do
    indexes :name
    indexes :name_sort, :type => "string", :analyzer => "sort_analyzer"
  end
...
end


def to_indexed_json
 {
    ...
    :name => {
      :name => all_localizations(:name).join(" "),
      :name_sort => all_localizations(:name).join(" ").mb_chars.strip.to_s
    },
    ...
  }
end

这解决了问题......