2016-06-08 15 views
3

Есть ли способ использовать несколько фильтров (используя построитель) для поиска индекса lassene cassandra?Несколько фильтров за поиск cassandra lucene index

Вот пример того, что я делаю:

// 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(); 

что предписанный способ делать что-то вроде этого? Благодаря!

ответ

4

Вы должны использовать 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 s способен выполнять простые логические как выражения, включая и незаменимый(), или с должны() или NOT с не() ,

Эта функция, добавленная к ее способности к гнезду, может создавать почти каждое возможное булево выражение. т.е:

((A && B && C) || (D && !E)) 

переводит:

bool().should(bool().must(A,B,C),bool().must(D,bool().not(E)))