Множество фильтров для каждого индекса поисковой кассанды

Есть ли способ использовать несколько фильтров (с помощью компоновщика) для поиска индекса 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)))
Другие вопросы по тегам