0

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

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 和轮胎宝石。

4

2 回答 2

0

我有一个非常奇怪的 Elastic 动作,但它没有按 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

这解决了问题....

于 2012-09-26T13:19:37.817 回答
0

在轮胎中,使用

sort { by "name.name_sort" }

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

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

于 2012-09-13T12:48:05.000 回答