2012-06-06 2 views
2

레일 3과 타이어 젬이있는 Elasticsearch 사용.ElasticSearch 및 타이어/레일 : 단일면에 대해 두 개의 필드 사용

몇 가지 필드에서 작업 할 패싯이 있지만 이제는 특별한 요구 사항이 있으며 가능하지 않은지 확실하지 않습니다. 내 모델 프로젝트에 동일한 값을 저장하는 두 개의 필드가 있습니다. 국가 1과 국가 2

사용자는 프로젝트에 대해 최대 두 개의 국가를 저장할 수 있습니다. 두 메뉴의 드롭 다운 메뉴는 동일합니다. 어느 필드도 필요하지 않습니다.

내가하고 싶은 것은 (이 일에 있었던 2의 여부, 즉 그것을 찾을 것)

가 여기 내 모델의 '병합'COUNTRY1 및 COUNTRY2의 값 지능적으로 그면을 클릭 핸들 것이다는 것을 하나의면이다 지금까지 : (국가 1/2는 여러 단어가 될 수 있습니다.)

class Project < ActiveRecord::Base 
    mapping do 
    indexes :id 
    indexes :title, :boost => 100 
    indexes :subtitle 
    indexes :country1, :type => 'string', :index => 'not_analyzed' 
    indexes :country2, :type => 'string', :index => 'not_analyzed' 
    end 
    def self.search(params) 
    tire.search(load: true, page: params[:page], per_page: 10) do 
    query do 
     boolean do 
     must { string params[:query], default_operator: "AND" } if params[:query].present? 
     must { term :country1, params[:country] } if params[:country].present? 
     end 
    end 
    sort { by :display_type, "desc" } 
    facet "country" do 
     terms :country1 
    end 

    end 
end 

유용한 정보!

답변

6

이 타이어에 https://github.com/karmi/tire/commit/730813f 커밋은 여러 분야에 걸쳐 집계에 대한 지원을 제공합니다 "용어"측면에서.

인터페이스는 다음과 같습니다

Tire.search('articles-test') do 
    query { string 'foo' } 
    # Pass fields as an array, not string 
    facet('multi') { terms ['bar', 'baz'] } 
end 
+0

Thanks 카렐, 이것이 진화하는 속도가 얼마나 빠를까요? – bobomoreno

+0

패싯에 대해 하나 이상의 단어를 반환하는 방법이 있습니까? 예를 들어 사용자 모델에 패싯을 사용하고 패싯에서 user_id와 이름을 반환하면 데이터베이스를 통해 사용자 이름을 조회 할 필요가 없습니다. – GreenEggs

0

용어 패싯 http://www.elasticsearch.org/guide/reference/api/search/facets/terms-facet.html 대한 elasticsearch 워드 프로세서에있어서이 가능하여야한다 :

다중 필드 :

용어 패싯은 하나 개 이상의 필드에 대해 수행 될 수

걸쳐 집계 결과를 리턴 그 들판. 예를 들면 :

{ 
    "query" : { 
     "match_all" : { } 
    }, 
    "facets" : { 
     "tag" : { 
      "terms" : { 
       "fields" : ["tag1", "tag2"], 
       "size" : 10 
      } 
     } 
    } 
} 

당신이 terms :country1, :country2 같은 용어면에 필드의 배열을 제공하려고 했습니까? {용어 필드 : [: COUNTRY1 : COUNTRY2]}면 ('국가') :

+0

덕분에,하지만 ... 사용 "조건 : COUNTRY1을 : COUNTRY2"는 "조건을 [사용하여 오류를 (기호 : COUNTRY2에 대한 정의되지 않은 메서드'삭제 ')를 제공합니다 : country1, : country2] "는 빈면을 보여줍니다 ... (값 없음) – bobomoreno

+0

이것은 작동하는 것으로 보이지만 더 테스트해야합니다 : facet ('country') {terms fields : [: country1, : country2]} – bobomoreno

0

이 작동하는 것 같다하지만 난 그것을 더 테스트해야