2015-10-30 2 views
0

Я попробую описать проблему. Допустим, у нас есть документ lucene с полями TITLE, DESC, TYPE. Теперь я искать по этим направлениям, как это:Как умышленно игнорировать подзапрос фильтра в Hibernate Search?

org.​apache.​lucene.​search.Query titleQuery = prepareTitleQuery(); 
org.​apache.​lucene.​search.Query descQuery = prepareDescQuery(); 
org.​apache.​lucene.​search.Query mainQuery = queryBuilder.bool().should(titleQuery).should(descQuery).createQuery() 
FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(mainQuery, Class.class); 
fullTextQuery.enableFullTextFilter("typeFilter").setParameter("types", types); 

Это очень упрощенный код, просто чтобы дать общее понимание того, что я делаю.

Теперь пример:

TITLE | DESC | TYPE 
Some title | hibernate search | 1 
Another title | lucene | 1, 3 
Something here | search lucene | 2, 8, 3 

Я ищу, как это:

TITLE:Another 
DESC:lucene 
TYPE:1 

Он найдет только вторую строчку. Но мне нужна третья строка. Есть ли способ сделать фильтр применимым только к titleQuery, но не к descQuery? Также у меня есть другие фильтры и сортировка, которые должны применяться к обоим.

ответ

0

Фильтры применяются к общему результату поиска. Они не применяются к частям сложного запроса. Я думаю, что лучше всего написать запрос заголовка в виде логического запроса, состоящего из двух частей: один для соответствия заголовку и один для соответствия типу. Насколько я понимаю, это то, чего вы хотите достичь.

+0

Привет, спасибо. Наконец я пришел к этому сам. Это то, что я сделал: 'для (Тип типа: типы) {' 'titleQuery = queryBuilder.bool(). Must (titleQuery) .must (queryBuilder.keyword(). OnField (" types.id ") .matching (type.getId()). createQuery()). createQuery(); ' '} ' –