2012-09-13 4 views
0

프로젝트에서 다른 로캘에 저장된 하나의 필드별로 레코드를 정렬해야합니다. 내가 가진 무엇 : 테이블 "기업", "이름"라는 이름의 필드가 없지만, 테이블이있다 : 내가해야ElasticSearch로 다른 로캘로 필드 정렬

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

:

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

나는 인덱스 company.rb이 이 필드를 정렬하십시오. 나는 ElasticSearch와 Tire gem을 사용하고 있습니다.

타이어에서

답변

0

은, 귀하의 경우

sort { by "name.name_sort" } 

를 사용합니다. 예에서 접두어 name_은 필요하지 않습니다.이 필드가 없으면 필드를 name.sort으로 참조 할 수 있습니다.

자세한 내용은 https://github.com/karmi/tire/blob/master/test/integration/sort_test.rb 및 기타 통합 테스트를 참조하십시오.

+0

내가 그렇게했지만, 내가 문제가있다 :이 두 로케일이 "EN"ADN "RUS"와 이름이 정렬됩니다 잘못된 순서. 그래서 예를 들어 가질 수 있습니다 : 회사 # 1 Компания Testtest Params –

0

나는 Elastic의 정말 이상한 행동을 취해 왔지만, multi_filed 유형에서는 정렬하지 않았다. 문제는 app에서 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 

....