2012-12-27 6 views
1

우리는 현재 2 개의 색인을 가진 2 노드 탄성 검색 클러스터를 실행 중입니다.이 광고는 (750k 문서와 1110 만 문서) 훌륭하게 수행됩니다.탄성 검색 용어 필터 천천히

이제 3540 만 개의 문서가 포함 된 새로운 색인을 추가하려고하는데 검색 성능이 느립니다. 용어 필터를 반환하는 데 약 2 초가 걸립니다.

매핑 :

tire do 
    mapping _routing: { required: true, path: :order_id } do 
    indexes :id,   type: 'string', index: :not_analyzed 
    indexes :order_id,  type: 'string', index: :not_analyzed 

    [:first_name, :last_name, :company_name, :title, :email, :city, :state_region_province, :postal_code].each do |attribute| 
     indexes attribute, type: 'string', analyzer: 'keyword' 
    end 

    indexes :metadata,  type: 'string' 
    indexes :clicks,  type: 'integer', index: :not_analyzed, include_in_all: false 
    indexes :view_count, type: 'integer', index: :not_analyzed, include_in_all: false 
    indexes :sender,  type: 'boolean', index: :not_analyzed, include_in_all: false 
    indexes :bounced,  type: 'boolean', index: :not_analyzed, include_in_all: false 
    indexes :unsubscribed, type: 'boolean', index: :not_analyzed, include_in_all: false 
    end 
end 

검색 중 :

Model.tire.search(load: true, page: page, per_page: per_page, routing: order_id) do |search| 
    search.query do 
    match :metadata, query, type: 'phrase_prefix', max_expansions: 10 
    end if query.present? 

    search.filter :term, order_id: order_id 
    search.filter :term, sender: false 
end 

난 그냥 필터링하는 ORDER_ID을 지정하는 것입니다하고있어 검색; 결과를 반환하는 데 약 2 초가 걸립니다. 어떻게 속도를 올리나요?

편집 : 이제 user_id의 색인을 생성하고이를 라우팅 경로로 사용합니다. 종단 배치를 테스트하기 위해 30 개 파편으로 새 인덱스를 만들었습니다.

편집 2 : (30)와 파편은, 인덱스가 더 성능이 좋은하지만 여전히 첫 번째 쿼리에 대한 데이터를 반환하는 두 번째 수행합니다. 나는 이것을 더 빠르게하거나 어떻게 잘못하고 있는지를 확신 할 수 없다.

답변

1

order_id 필드의 분석을 :keyword으로 토글하면 어떻게됩니까? 올린 사람 :

indexes :order_id,  type: 'string', index: :not_analyzed 

에 :

indexes :order_id,  type: 'string', index: :keyword 

The docs

말 :

형 키워드의 분석이 "토큰 화"하나의 토큰으로 전체 스트림입니다. 이것은 우편 번호, ID 등과 같은 데이터에 유용합니다.

order_id에 적용되는 것 같습니다.

+0

나는 필터가 특별히 그것을 언급하기 때문에 'not_analyzed'했어 : http://www.elasticsearch.org/guide/reference/query-dsl/term-filter.html – ryansch

+0

솔직히 수치 같은 것 id not_analyzed와 keyword의 차이점을 잘 모르겠습니다. 키워드 분석기는 전체 입력을 단일 토큰으로 뱉지 만,이 경우 숫자 ID는 분석되지 않을 때 이미 단일 토큰입니다. – ryansch

+0

단일 토큰에 대한 좋은 지적. –

1

쿼리에 패싯을 사용하지 않는 경우 쿼리를 filtered query으로 변환하고 최상위 수준에서 용어 필터를 필터링 된 쿼리의 필터로 이동하는 것이 좋습니다. 또한 Performance of elastic queries

+0

나는 그것을 소용돌이 치고 다시보고 할 것이다. – ryansch

+0

나는 아무런 차이없이 그것을 시도했다. 내 검색에서 검색어 문자열을 지정하지 않고 2 단어 필터를 테스트하는 것입니다. – ryansch