2016-10-29 3 views
0

나는 앱과 같은 틴더에서 작업하고 있습니다.탄성 검색 조건 많은 사용자 제외 쿼리

must_not : [{ "용어": { "swipedusers": [ "은 : userid1", "은 : userid1", "사용자가 이전에 슬쩍 한 프로파일을 배제하기 위해,이 같은"must_not "쿼리를 사용하여 userid1 "...]}}]

이 방법을 사용하는 데 한계가있는 것은 아닌지 궁금합니다. swipedusers 배열에 2000 개의 사용자 ID가 포함될 때도 사용할 수있는 확장 가능한 접근 방식입니까? 이것에 더 나은 확장 가능한 접근 방식이 있다면 나는 알고 행복 할 것입니다 ...

+0

의 사용 가능한 복제 [I는 IDS 필터 또는 일반적으로 쿼리 절에 지정할 수있는 값의 수에 대한 최대 한계?] (http://stackoverflow.com/questions/26642369/max-limit-on-the -number-of-values-i-can-specify-the -ids 필터 또는 일반적으로 q) – ChintanShah25

+0

질문은 elasticsearch에 의해 적용되는 엄격한 제한에 관한 것입니다. 내 질문은 확장 성 및 좋은 연습에 관한 것입니다. –

답변

1

더 나은 접근법이 있습니다! "용어 조회 (terms lookup)"라고 불리는 것은 관계형 데이터베이스에서 할 수있는 전통적인 조인과 같은 것입니다 ...

여기서 설명하려고하지만, 필요한 모든 정보는 공식 문서에 잘 설명되어 있습니다. 탄성 검색 페이지 :

최종 용액 2 인덱스의 등록 된 사용자 및 각 사용자의 와이프를 추적하기 위해 다른 하나를 구비한다

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/query-dsl-terms-query.html#query-dsl-terms-lookup

. 그런 다음 각 스 와이프에 대해 현재 사용자 스 와이프가 포함 된 문서를 업데이트해야합니다. 여기에 배열에 요소를 추가해야하며 ElasticSearch에서 또 다른 문제입니다 (AWS로 관리하는 ElasticSearch를 사용하는 경우 큰 문제). 귀하의 경우를 들어 https://www.elastic.co/guide/en/elasticsearch/guide/current/partial-updates.html#_using_scripts_to_make_partial_updates

에서 스크립트 ... 더 많은 정보를 사용하여 해결 될 수, 쿼리가 같은 발생합니다 :

GET /possible_matches/_search 
{ 
    "query" : { 
     "terms" : { 
      "user" : { 
       "index" : "swiped", 
       "type" : "users", 
       "id" : "current-user-id", 
       "path" : "swipedUserId" 
      } 
     } 
    } 
} 

당신이 계좌에서해야 또 한가지하면에 대한 복제 구성입니다 각 노드는 해당 인덱스와 "조인"을 수행하므로 인덱스를 전체적으로 복사하는 것이 좋습니다. ach 노드. "auto_expand_replicas"및 "0-all"값을 사용하여 인덱스를 만들 수 있습니다.

PUT /swipes 
{ 
    "settings": { 
     "auto_expand_replicas": "0-all" 
    } 
} 
+0

와우, 고마워. 이것은 훌륭하게 작동합니다. 이 접근 방식은 하나의 문제를 야기하지만 ... 사용자 A가 사용자를 (스 와이프하기 위해) 쿼리하면 사용자 B가 이미 좋아하는 사용자에게 점수를 매기려고합니다. 일치하는 확률이 분명히 높아지기 때문입니다. 그러나 용어 조회로 고정 ID를 지정해야합니다. 이 ID를 동적으로 유지하는 방법은 현재 쿼리 된 레코드의 ID와 같습니다. 예를 들어 첫 번째 히트 결과가 사용자 c 인 경우 용어 조회가 사용자 c의 스 와이프 기록을 확인합니까? –