2012-05-03 2 views
5

나는이 elasticsearch와 색인 그 중 하나가 필터를 적용 할 필요가 연관을 가지고 있지만, 몇 가지 모델 나는 search 방법필터 레일에 타이어와 ElasticSearch와 하나 개의 모델에 적용

search.filter :range, 'sessions.starts_on' => {:gte => start_date, 
               :lte => ends_on} 
에 다음과 같이 뭔가를 추가하는 경우

그런 다음 모든 모델은 이러한 연관이 없기 때문에 필터링됩니다. sessions.

하나의 모델에만 필터를 적용 할 수있는 방법이 있습니까?

의견을 보내 주시면 감사하겠습니다.

+0

AciveRecord를 사용하고 있습니까? 그리고 이것을 위해 to_json 인덱스 메소드를 커스터마이즈하는 것을 고려해 보셨습니까? – abhas

+0

예 ActiveRecord입니다. 그리고 커스터마이징 색인 - 정확히 어떻게? 이 '세션들'을 갖는 것. 무엇을 돌려 주는가? – alony

답변

1

해당 모델과 관련된 타이어 색인 모듈을 만들어 모델에 포함하십시오. 세션은 모델과의 연관성 만 있으므로 문서에서 elasticsearch 할 참조가있을 것입니다. 우리는 타이어 인덱스 모듈에 elasticsearch하는 문서의 JSON을 통과으로이 같은 모델 문서의 세션 문서를 병합해야

def to_model_json 
    self.document.merge({"sessions" => sessions.as_json}).to_json 
end 

이 방법이 필요합니다 타이어를 통해 elasticsearch하는 JSON에서 문서를 전달하고 자신의 세션에서 문서에 병합되었습니다. 필터를 실행하기 위해 타이어 검색 대상에 전달할 수있는 인덱스 이름을 지정 타이어 인덱스 모듈에

지금 당신이 다른 속성을 확인할 수 있습니다 타이어 검색 대상

search_object = Tire::Search::Search::new(Model.index_name, other attributes) 

을 만들 쿼리하는 당신을 다음과 같은 검색 방법을 실행 https://github.com/karmi/tire

에서 전달할 수있는 것은 원하는 결과

search_object.filter :range, 'sessions.starts_on' => {:gte => start_date, 
                :lte => ends_on} 
0 줄 것이다