ElasticSearch-Использование FilterBuilders
Я новичок в ElasticSearch и Couchbase. Я создаю образец Java-приложения, чтобы узнать больше об ElasticSearch и Couchbase.
чтение API Java ElasticSearch, фильтры лучше использовать в тех случаях, когда сортировка по счету не требуется и для кэширования. Я до сих пор не понял, как использовать FilterBuilders и имею следующие вопросы:
- можете
FilterBuilders
использовать только для поиска? - или они всегда имеют для использования с
Query
? ( Если это правда, может ли кто-нибудь привести пример? ) - просматривая документацию, если я хочу выполнить поиск на основе значений полей и хочу использовать FilterBuilders, как я могу это сделать? (используя
AndFilterBuilder
илиTermFilterBuilder
илиInFilterBuilder
? Я не совсем понимаю разницу между ними.)
для 3-го вопроса я фактически протестировал его с помощью поиска с использованием запросов и фильтров, как показано ниже.
Я получил пустой результат (без строк), когда я пробовал поиск с помощью FilterBuilders
. Не знаю, что я делаю не так.
любые примеры будут полезны. У меня было трудное время, просматривая документацию, которую я нашел разреженной и даже поиск привел к различным ненадежным форумам пользователей.
private void processQuery() {
SearchRequestBuilder srb = getSearchRequestBuilder(BUCKET);
QueryBuilder qb = QueryBuilders.fieldQuery("doc.address.state", "TX");
srb.setQuery(qb);
SearchResponse resp = srb.execute().actionGet();
System.out.println("response :" + resp);
}
private void searchWithFilters(){
SearchRequestBuilder srb = getSearchRequestBuilder(BUCKET);
srb.setFilter(FilterBuilders.termFilter("doc.address.state", "tx"));
//AndFilterBuilder andFb = FilterBuilders.andFilter();
//andFb.add(FilterBuilders.termFilter("doc.address.state", "TX"));
//srb.setFilter(andFb);
SearchResponse resp = srb.execute().actionGet();
System.out.println("response :" + resp);
}
-обновление--
как предложено в ответе, изменение на нижний регистр" tx " работает. С этим вопросом решено. У меня все еще есть следующие вопросы:
- в каком случае(Ях), фильтры используются с запросом? Какой цели это послужит?
- разницу между
InFilter
,TermFilter
иMatchAllFilter
. Любая иллюстрация поможет.
3 ответов
правильно, вы должны использовать фильтры, чтобы исключить документы даже из рассмотрения при выполнении запроса. Фильтры быстрее, так как они не включают в себя скоринг, а также cacheable.
тем не менее, это довольно очевидно, что вы должны использовать фильтр с поиск api, который выполняет запрос и принимает необязательный фильтр. Если у вас есть только фильтр, вы можете просто использовать match_all запрос вместе с фильтром. Фильтр может быть простой, или соединений, чтобы объединить несколько фильтров одновременно.
о Java API, используемые имена-это имена доступных фильтров, без большой разницы. Взгляните на этот пример поиска например. В вашем коде я не вижу где ты setFilter
на
добавить к тому, что @javanna сказал:
большая путаница может возникнуть из - за того, что фильтры могут быть определены несколькими способами:
- автономный (с обязательным запросом, например
match_all
Если все, что вам нужно, это фильтры) (http://www.elasticsearch.org/guide/reference/api/search/filter/) - или как часть отфильтрованного запроса (http://www.elasticsearch.org/guide/reference/query-dsl/filtered-query/)
в чем разница, которую вы можете спросить. И действительно, Вы можете построить точно такую же логику в обе стороны.
разница в том, что запрос работает как с результирующим набором, так и с любыми определенными вами гранями. В то время как фильтр (когда он определен автономно) работает только с результирующим набором, а не с любыми гранями, которые вы, возможно, определили (объяснено здесь: http://www.elasticsearch.org/guide/reference/api/search/filter/)
чтобы добавить к другим ответам, InFilter используется только с FilterBuilders. Определение: InFilter: фильтр для поля, основанный на нескольких терминах, соответствующих любому из них.
запрос Java API использует FilterBuilders, который является фабрикой для построителей фильтров, которые могут динамически создавать запрос из кода Java. Мы делаем это с помощью формы, и мы строим наш запрос на основе выбора пользователя с галочками, опции и выпадающих меню.
вот пример код для FilterBuilders и есть фрагмент из этой ссылки, который использует InFilter, как показано ниже:
FilterBuilder filterBuilder;
User user = (User) auth.getPrincipal();
if (user.getGroups() != null && !user.getGroups().isEmpty()) {
filterBuilder = FilterBuilders.boolFilter()
.should(FilterBuilders.nestedFilter("userRoles", FilterBuilders.termFilter("userRoles.key", auth.getName())))
.should(FilterBuilders.nestedFilter("groupRoles", FilterBuilders.inFilter("groupRoles.key", user.getGroups().toArray())));
} else {
filterBuilder = FilterBuilders.nestedFilter("userRoles", FilterBuilders.termFilter("userRoles.key", auth.getName()));
}
...