0

プロジェクトでは、異なるロケールに格納されている1つのフィールドでレコードを並べ替える必要がありました。私が持っているもの:テーブル "companies"、 "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とTiregemを使用しています。

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 に答える