2017-09-29 1 views
0

에 대한 인덱스가 있습니다.은 Solr입니다. 각 고객에 대해 맞춤 제품 목록을 제공해야 각 고객을 위해 특정 제품을 제외해야합니다. 현재 제외 된 고객 &의 관계를 SQL 데이터베이스에 저장하고 용어 쿼리를 사용하여 Solr에서 필터링합니다. Solr 자체에이 관계를 저장할 수있는 방법이있어 SQL에서 매번 제외 목록을 계산하지 않아도됩니다. 내가 SOLR에서 일을 생각할 수있는 우리가 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html런타임에 Solr에서 IDS의 거대한 목록을 필터링하는 방법

가능한 방법을 사용하여 elasticsearch에서 할 수있는 것과 매우 유사

뭔가 :

  1. 는 제품 색인 자체 및 필터 고객의 목록을 유지 그걸로. 그러나 모든 문서를 다시 색인화해야하는 경우 이는 매우 고통 스러울 것입니다. 또한 목록은 엄청날 수 있습니다.

  2. 내가 생각할 수있는 또 다른 방법은 고객 당 문서를 보관하고 product_id를 제외하기위한 별도의 핵심을 유지하고 {! join}을 사용하여 고객을위한 제품을 필터링하는 것입니다. 확장 가능한 솔루션입니까?

이러한 종류의 데이터를 Solr에 저장하기위한 이상적인 접근 방법은 무엇입니까?

답변

1

SQL DB에 성능 문제가 있습니까? DB를 쿼리하고 ID를 얻은 다음 Solr에게 보내면됩니다. 복잡성과 데이터 중복을 피할 수 있습니다. 어쨌든 Solr에게도 ID를 보내려면 계산을해야 할 것입니다.

그러나 질문에 대답하려면 고객 별 제외 된 제품 ID를 실제로 별도의 색인에 저장할 수 있습니다. 다중 값 필드 및 update using atomic updates을 사용하게됩니다. 그렇게 할 경우 ID에 사용되는 분석기가 없도록 색인 스키마를 간단하게 유지하십시오 (토큰 화나 필터없이 string 유형 만 사용하십시오).

Solr 조인 쿼리를 수행 할 필요가 없습니다. 고객 당 제품 ID를 조회하고 (첫 번째 쿼리) CSV로 마사지하고 인덱스 (두 번째 쿼리)에서 검색 한 제품 ID로 terms query을 수행하면됩니다.

+0

감사합니다. 나는 SQL 접근 방식만을 사용할 것이라고 생각한다. ID를 사용하여 ID를 필터링합니다. –

1

당신은 최선의 타협을 찾을 필요가 당신

당신은 제품 색인에 필드를 (멀티는 가치)를 추가 최저 쿼리 시간 공연 : 당신이 원하는 것을 중요도에 따라 allowed_users (또는 forbidden_users을() 최소화). 처음으로 다시 색인화해야하고 각 사용자 권한 변경에 대한 색인 업데이트가 필요합니다. 네트워크 트래픽을 줄이고 업데이트를 최적화하기 위해 원자 적 업데이트 [1]를 살펴볼 수 있습니다.

최저 색인 시간 공연 이전의 접근 방식은 귀하의 경우 가능하지 않거나 당신을 만족하지 않습니다, 당신은 인덱싱 측면을 최적화하기 위해 시도 할 수 있다면. 당신 별도의 컬렉션의 인덱스 문서를 할 수 있습니다

<Id> 
<product_id> 
<user_id> 

당신은 현재 사용자에 대한 컬렉션을 필터링하는 조인 쿼리 시간을 사용하여 다음 쿼리를 필터링 할 제품을 다시 얻을 수 있습니다.

은 그러니까 기본적으로, 당신은 이미 모두 아이디어에 대해 생각 :

[1] 여기에 응답 https://lucene.apache.org/solr/guide/6_6/updating-parts-of-documents.html

관련 문제