2014-01-13 3 views
1

나는 현재의 컨텍스트와 관련된 문서 (파일)를 추천하는 서비스를 가지고 있습니다. 필터와 조합하여 ElasticSearch more_like_this를 사용합니다 (아래 쿼리 참조). 이러한 문서는 사용자가 업로드하고 공개 된 경우 다른 사용자에게도 추천 할 수 있습니다. 그것은 잘 작동하지만 두 명 이상의 사용자가 동일한 파일을 업로드 할 때 문제가 발생합니다. elasticsearch에 같은 문서의 인스턴스가 두 개 이상 있으며 두 파일 (또는 그 이상)이 권장 될 가능성이 큽니다.Elasticsearch에서 항상 다른 문서 (파일)를 추천하는 방법

누구나 ElasticSearch가 이러한 중복을 무시하고 동일한 파일 인스턴스를 하나만 반환하도록 할 수있는 방법이 있습니까?

POST _search 
{ 
"query": { 
    "filtered": { 
    "query": { 
     "mlt": { 
     "fields": [ 
      "file" 
     ], 
     "like_text": "Some sample text here", 
     "min_term_freq": 1, 
     "max_query_terms": 1, 
     "min_doc_freq": 1 
    } 
    }, 
"filter" : { 
    "or" : { 
    "filters" : [ { 
     "term" : { 
     "visibility" : "public" 
     } 
    }, { 
     "and" : { 
     "filters" : [ { 
      "term" : { 
      "visibility" : "private" 
      } 
     }, { 
      "term" : { 
      "ownerId" : 2 
      } 
     } ] 
     } 
    } ] 
    } 
} 
} 
}, 
"fields": [ 
    "id","title","visibility", "ownerId","contentType", "dateCreated", "url"] 
} 

편집 됨 :

나는이 문제의 첫 번째 부분을 해결했다. 티카를 사용하여 웹 페이지 또는 텍스트 문서에서 내용을 추출합니다. 그런 다음 가장 비슷한 문서를 찾기 위해 비슷한 쿼리로이 쿼리를 사용하고 0.9보다 높은 값을 갖는 쿼리는 중복으로 표시됩니다. 이를 위해 UUID 값을 갖는 새로운 필드 "고유성"을 사용하고 있습니다. 인덱스 할 새 문서가 중복 된 경우 "고유성"값을 복사하고 중복이 없으면 해당 문서의 "고유성"값을 새로 작성합니다.

그러나 아직 해결하지 못한 문제의 두 번째 부분은 이러한 중복을 제거하는 쿼리 작성 방법입니다. 기본적으로 위에 언급 한 쿼리에서 필드 "고유성"과 동일한 값을 가진 문서 인스턴스를 하나만 선택하는 부분을 통합해야합니다.

아무도 아이디어를 어떻게 해결할 수 있습니까?

답변

2

인덱싱 중에 값을 "true"또는 중복 문서의 ID로 설정할 수있는 "중복"필드를 정의 할 수 있습니다. 그런 다음 이러한 문서를 필터링 할 수 있습니다.

+0

예. 그게 가능한 해결책이지만, 내가 elasticsearch에서 고유 한 파일을 검색 할 수있는 솔루션을 찾고 싶었습니다. 당신이 제안한 것이 적용된다면, 파일의 중복을 찾는 가장 좋은 방법은 무엇입니까? More Like This를 사용하고 점수가 1.0에 가까운 결과를 선택하십시오. –

+1

그건 옵션이 될 것입니다. 그러나 내용이 정확히 같으면 복제본을 찾기 위해 해시 (예 : MD5)를 사용하는 것이 좋습니다. – fatih

+0

그건 내 첫 번째 아이디어지만, 예를 들어 두 명의 사용자가 서로 다른 pdf 프린터에서 생성 된 동일한 pdf 책을 업로드하여 책 중 하나에 누락 된 글자 1 개가있는 경우 원하는 결과를 얻지 못할까 우려했습니다. 이 파일들에 대한 MD5는 동일하지 않으므로 동일한 책의 두 인스턴스를 다시 추천 할 것입니다. –