Множество фильтров для каждого индекса поисковой кассанды
Есть ли способ использовать несколько фильтров (с помощью компоновщика) для поиска индекса lucene Кассандра?
Вот пример того, что я делаю:
// Age Filter
conditionsToFilter.add(range("age")
.lower(indexFormatDate(preferences.getAgeMax()))
.upper(indexFormatDate(preferences.getAgeMin()))
.includeLower(true)
.includeUpper(true)
.docValues(DOC_VALUES));
// Height Filter
conditionsToFilter.add(range("height")
.lower(preferences.getHeightMin())
.upper(preferences.getHeightMax())
.includeLower(true)
.includeUpper(true)
.docValues(DOC_VALUES));
// Distance Filter
conditionsToFilter.add(geoDistance("location",
preferences.getCurrentUserLocation().getLongitude(),
preferences.getCurrentUserLocation().getLatitude(),
String.format("%dmi", preferences.getDistanceMax())));
// Apply Filters
Search searchObj = com.stratio.cassandra.lucene.builder.Builder.search();
for (Condition condition : conditionsToFilter) {
searchObj.filter(condition); <-- this definitely won't work
}
// Create Search String
String query = searchObj
.refresh(false)
.build();
Каков предписанный метод сделать что-то подобное? Спасибо!
1 ответ
Вы должны использовать BooleanQuery.
Заменить это:
// Apply Filters
Search searchObj = com.stratio.cassandra.lucene.builder.Builder.search();
for (Condition condition : conditionsToFilter) {
searchObj.filter(condition); <-- this definitely won't work
}
с:
Search searchObj = com.stratio.cassandra.lucene.builder.Builder.search();
searchObj.filter(bool().must(conditionsToFilter))
BooleanQuery- ы могут выполнять простые логические выражения, включая AND с must(), OR с must () или NOT с not().
Эта функция, добавленная к его способности вкладывать, позволяет создавать практически все возможные логические выражения. IE:
((A && B && C) || (D && !E))
переводится как:
bool().should(bool().must(A,B,C),bool().must(D,bool().not(E)))