메시지를 검색하고 싶습니다. 제목과 주제에 따라 하지만 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);