簡體   English   中英

使用ElasticSearch在具有不同區域設置的字段上排序

[英]Sort on field with different locale with ElasticSearch

在項目中,需要按存儲在不同語言環境中的一個字段對記錄進行排序。 我所擁有的:表“ 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和Tire寶石。

在輪胎中使用

sort { by "name.name_sort" }

在你的情況下。 您的示例中不需要name_前綴-沒有它,您可以將字段稱為name.sort

有關更多信息,請參見https://github.com/karmi/tire/blob/master/test/integration/sort_test.rb和其他集成測試。

我對Elastic有一個非常奇怪的動作,但是它沒有對multi_filed類型進行排序。 有一個問題,在應用程序中,它可能是數據庫中英語語言環境中的俄語符號和俄語語言環境字段中的英語符號,因此它沒有使用multi_filed類型進行排序...我已經成功地將multi_filed更改為nested以這種方式:

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

解決了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM