2017-04-23 1 views
1

나는 초보자부터 lucene입니다. 이제 검색 문제로 인해 차단되었습니다. 우리는 우리의 응용 프로그램을위한 검색 엔진으로 lucene을 사용하기위한 API를 개발 중이고 조인 된 다른 조건으로 많은 쿼리를 만들어야합니다.AND 연산으로 여러 Lucene 문서를 연결/결합하는 방법

많은 엔티티를 개별 문서로 lucene에 저장합니다.

각 엔티티는 레코드 수로 제공되고 개별 문서로 lucene에 저장됩니다. 아래에 데이터 샘플 구조가 추가되었습니다.

일련 번호. 1 -> 16은 lucene에 대한 문서입니다.

1) "id": "1","sendr_name": "**sender1**", "recip_name": "**recipient1**", "subject": "**subject1**" 
    2) "id": "1","attachment": "**attachment1**" 
    3) "id": "1","domain": "**domain1**", "ip": "ip1" 
    5) "id": "1","mid": "**mid1**" 
    6) "id": "1","type": "type1" 

    7) "id": "2","sendr_name": "sender1", "recip_name": "recipient1", "subject": "subject1" 
    8) "id": "2","attachment": "attachment2" 
    9) "id": "2","domain": "domain1", "ip": "ip2" 
10) "id": "2","mid": "mid2" 
11) "id": "2","type": "type2" 

    12) "id": "3","sendr_name": "sender1", "recip_name": "recipient3", "subject": "subject3" 
    13) "id": "3","attachment": "attachment3" 
    14) "id": "3","domain": "domain1", "ip": "ip3" 
    15) "id": "3","mid": "mid3" 
    16) "id": "3","type": "type3" 

참고 : 일련 번호. 1-16은 다른 엔티티에 대한 문서이고 "id"필드가 내부적으로 생성되므로 id 값을 사용자가 쿼리 값으로 사용할 수 없습니다.

내 조건은 특정 조건의 특정 엔티티 또는 엔티티를 추출하는 것입니다.

+sendr_name:sender1 + recip_name:recipient1 +subject:subject1 +attachment:attachment1 +domain:domain1 +mid:mid1 

이것은 엔티티 정보 (엔티티에 대해 1-6 개의 문서)를 가져 오는 것입니다.

위의 쿼리는 다른 문서의 첨부 파일, 중간 및 도메인 때문에 결과를 반환하지 못합니다.

여러 문서에 적용 할 수있는 방법이 있습니까? 또는 어쨌든 doc1.id = doc2.id와 같은 필드에서 쿼리를 조인 할 수 있습니까?

여러분의 의견을 제안하거나이 문제를 해결하는 데 도움을 주시기 바랍니다.

+0

누구든지이 문제를 해결할 수 있습니까? –

+0

elasticsearch 또는 원시 Lucene API를 사용하고 있습니까? –

+0

원시 Lucene API 만 사용하고 있습니다. –

답변

0

우선 Lucene을 사용하면 장기적으로 다른 문제가 발생할 수있는 동일한 색인에 이기종 문서를 저장하지 않는 것이 좋습니다.

통해 이동 SO Answer. 당신은 당신이 묘사하는 시나리오를보다 잘 처리 할 수있는 SOLR이나 ElasticSearch와 같은 다른 최상위 기술자를 더 잘 활용하십시오.

Java 또는 .NET 또는 Lucene API 버전을 사용하는 경우 코드가 표시되지 않으므로 코드가 표시되지 않습니다.

나는 Lucene 6.0을 Java와 함께 사용하고 있으며, 최상위 컨테이너로 -BooleanQuery으로 달성 할 수 있다고 생각합니다.

즉, 먼저 검색해야하는 항목에 따라 각 엔터티 유형에 대한 쿼리를 작성합니다. SearchBean은 결합 된 모든 유형의 모든 검색 가능한 필드가있는 POJO입니다.

private static BooleanQuery.Builder buildDoc1Query(SearchBean searchBean) { 
     BooleanQuery.Builder doc1MatchQuery = new BooleanQuery.Builder(); 

     if (StringUtils.isNotEmpty(searchBean.getSender_name())) { 
      doc2MatchQuery.add(new BoostQuery(new TermQuery(new Term(AppConstants.SENDER_NAME, searchBean.getSender_name())), MatchingBooster.SENDER_NAME), BooleanClause.Occur.MUST); 
     } 
     if (StringUtils.isNotEmpty(searchBean.getRecip_name())) { 
      doc2MatchQuery.add(new BoostQuery(new TermQuery(new Term(AppConstants.RECIP_NAME, searchBean.getRecip_name()())), MatchingBooster.RECIP_NAME), BooleanClause.Occur.MUST); 
     } 

    .... 
    .... 

     return doc2MatchQuery; 
    } 

StringUtils은 Apache Commons 라이브러리에서 제공됩니다.

AppConstants에는 색인 필드 이름이 포함되어 있습니다.

여기에서 중요한 것은 하위 쿼리에 - BooleanClause.Occur.MUST, 마스터에 Occur.SHOULD이며 하위 쿼리를 하나의 마스터 쿼리로 그룹화하는 것입니다.

그러면 (+sendr_name:sender1 + recip_name:recipient1 +subject:subject1) (+attachment:attachment1) .... 등이 표시됩니다.

위는 doc1을 제공합니다. & doc2.

위의 샘플 코드 (BoostQuery)에서 부스팅 부분을 제거하고 TermQuery을 직접 사용할 수 있습니다.

귀하의 요구 사항을 오해 한 경우 알려 주시면 감사하겠습니다.

+0

감사합니다. 사비르. 당신이 설명하는 매우 상세하고 이해하기 쉬운 방법. 나는 너에게 따라 노력할 것이다. 나도 지금까지 너와 거의 똑같은 방식으로 따라왔다. 예, 저는 Java로만 개발 중입니다. 미안하지만 언급하지 않았습니다. 나는 다시 시도하고 돌아올 것입니다. 고마워. –

관련 문제