【问题标题】:Sort on field with different locale with ElasticSearch使用 ElasticSearch 对具有不同语言环境的字段进行排序
【发布时间】:2012-09-06 11:20:23
【问题描述】:

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

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。

【问题讨论】:

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


    【解决方案1】:

    在轮胎中,使用

    sort { by "name.name_sort" }
    

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

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

    【讨论】:

    • 我已经这样做了,但是我有一个问题:有两个语言环境“en”和“rus”,并且名称的排序顺序错误。所以我可以有例如:Company#1 Компания Testtest Params
    【解决方案2】:

    我有一个非常奇怪的 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-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 2010-10-11
      • 2010-12-04
      • 1970-01-01
      相关资源
      最近更新 更多