2016-06-01 1 views
0

메시지를 검색하고 싶습니다. 제목과 주제에 따라 하지만 lucene이 검색 할 수있는 ID가있는 목록이 있습니다.ID 목록 (IN 연산자)에 의한 검색/필터링 lucene

그냥 이드의 제한을 추가하고 싶습니다. 쉬운 작업처럼 보이지만 해결책을 찾을 수 없습니다 ...
그래서 기본적으로 : (검색어) AND (id IN (list-of- ids)).

내가 이해하는 것처럼, lucene에는 IN 연산자가 없습니다.
나는 지금까지는 성공하지 못했지만, BooleanJunctions를 결합하려고 시도했다.
필자는 필터 구현을 시도했지만, 이것은 매우 이상한 DocIdSet/DocIdSetIterator를 예상합니다.

Java로 구현되었으며 lucene의 버전은 3.6.2입니다. 내가 시도

뭔가 :

final FullTextSession fullTextSession = Search.getFullTextSession(getSession()); 
    final QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Message.class).get(); 
    final BooleanJunction<?> booleanJunction = queryBuilder.bool(); 

    final String[] searchTerms = StringUtils.split(criteria, "\\W+"); 

    for (final String term : searchTerms) { 
     if (StringUtils.length(term) > 2) { 
      BooleanJunction<?> booleanJunctionIds = queryBuilder.bool(); 
      for (Long id : messageIds) { 
       booleanJunctionIds.must(queryBuilder.keyword().onField("id").matching(id).createQuery()); 
      } 
      BooleanJunction<?> booleanJunctionSearch = queryBuilder.bool(); 
      booleanJunctionSearch.should(queryBuilder.keyword().onFields("subject").matching(criteria).createQuery()); 
      /**...**/ 

      booleanJunction.must(booleanJunctionIds.createQuery()).must(booleanJunctionSearch.createQuery()).createQuery(); 
     } 
    } 

    final FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(booleanJunction.createQuery(), Message.class); 

답변

0

해야해야 요소를 중첩의 적절한 조합으로 BooleanQuery를 만드는 일반적인 접근이 정확이 작동합니다.

"id"용어가 인코딩되는 방식이나 "주제"와 비슷한 문제가있을 수 있습니다. 부울 검색어의 하위 절에 정확한 키워드 일치를 사용하고 입력 기준을 직접 분할해야합니다. .

각 키워드의 경우를 포함하여 인코딩이 완전히 동일해야하므로 비트 오류가 발생하기 쉽습니다. BooleanQuery가 요소와 일치하는 경우 개별 절을 사용하는 것이 좋습니다 기대하고있다.

다양한 Lucene 쿼리 인스턴스를 병합하기 전에 개별 요소에 대한 테스트를 도입하여 모든 텍스트 처리가 일치하는지 확인하고 부울 연산자 만 조합 할 수 있도록하는 것이 좋습니다.