2013-09-03 2 views
1

My Rails 응용 프로그램에서 Tire를 사용하여 Elasticsearch와 통신합니다. 지금까지 모든 것이 잘 작동합니다.MySQL JDBC 강에서의 Elasticsearch 필터링 결과

일부 외부 데이터 소스의 색인 생성 문제가 있습니다.

레일스에서 ​​업데이트되지 않은 추가 소스가 있으며이 정보를 얻기 위해 Elasticsearch river JDBC plugin을 사용하여 매 60 초마다 데이터베이스를 폴링합니다.

이 데이터는 Rails 애플리케이션 내에서 액세스됩니다. 다른 모델에서 나는 검색 데이터에 대한 사용자의 액세스를 제한하는 간단한 필터를 사용하고 있습니다 : location_users가 타이어에 의해 인덱싱 동안 배열로 매핑되는

def self.search(params) 
    tire.search(page: params[:page], per_page: 50) do |s| 
    ... 
    filter << { :terms => { location_users: [params[:user_id]] }} if params[:user_id] 
    ... 
    end 
end 

.

def to_indexed_json 
    to_json methods: [:location_users] 
end 

def location_users 
    location.users.map(&:id) if location 
end 

강을 사용

(I 다른 사람의 계정 데이터를 검색하는 사용자를하지 않으려는) 내가 MySQL의에서 데이터 및 관련 테이블 열을 얻을 수있는 몇 가지 SQL을 썼다. 내가 location_users의 목록을 얻을 수있는 유일한 방법은 다음과 같이 뭔가를 수행하여이었다

SELECT a.*, l.location_name, GROUP_CONCAT(lu.id) as location_users FROM accounts... 

것은 나에게 쉼표로 구분 된 값으로 location_users 필드를 주었다. 그러나 분명히 배열이 아닙니다.

이제 검색 할 때 필터가 배열을 찾고 반환되는 목록 일 뿐이므로 결과가 0이됩니다.

이 필드를 배열로 색인화 할 수있는 방법이 있습니까? 아니면 다시 작동하도록 필터를 변경하는 방법이 있습니까?

답변

0

본 같이 SQL 다시 쓸 수

SELECT a.*, l.location_name, GROUP_CONCAT(lu.id) as `location_users[]` FROM accounts... 

을하면 '[]'Elasticsearch 강 JDBC 플러그인 값을 분할하여 배열에 값을 변환한다 (세퍼레이터로서 콤마 사용) 필드 이름 끝에 그것을 저장하십시오. 그래서 필드 데이터 '1, 2, 3, 4, 5'가 될 것이다 [1, 2, 3, 4, 5]

+0

이 인식 아니었다 색인화 할 때. 나중에 테스트 할 것입니다. – simonmorley