Отфильтрованный запрос в API API Elasticsearch
Я немного запутался, создав фильтр-запрос в Elasticsearch Java API.
Класс SearchRequestBuilder имеет метод setPostFilter, javadoc этого метода ясно говорит, что фильтр будет применяться после выполнения Query.
Однако нет метода setFilter или какого-либо другого метода, который позволит применять фильтр перед использованием
запрос выполняется. Как создать фильтрованный запрос (который в основном применяет фильтр до выполнения запроса) здесь? Я что-то пропустил?
Ответы
Ответ 1
FilteredQueryBuilder builder =
QueryBuilders.filteredQuery(QueryBuilders.termQuery("test",
"test"),FilterBuilders.termFilter("test","test"));
Он построит отфильтрованный запрос... В файл filterQuery первым аргументом является запрос, а во втором - Filter.
Обновление: Отфильтрованный запрос обесценивается в elasticsearch 2.0+. refer
Надеюсь, это поможет..!
Ответ 2
Если вы хотите просто выполнить фильтр без запроса, вы можете сделать это следующим образом:
FilteredQueryBuilder builder = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(),
FilterBuilders.termFilter("username","stackoverflow"));
Ссылка: Фильтрация без запроса
Ответ 3
QueryBuilders.filteredQuery
устарел в API версии 2.0.0 и более поздних.
Вместо этого фильтры и запросы имеют "равные права". FilterBuilders
больше не существует, и все фильтры построены с помощью QueryBuilders
.
Чтобы реализовать запрос только с фильтром (в данном случае, гео-фильтр), вы теперь выполните:
QueryBuilder query = QueryBuilders.geoDistanceQuery("location")
.point(center.getLatitude(), center.getLongitude())
.distance(radius, DistanceUnit.METERS);
// and then...
SearchResponse resp = client.prepareSearch(index).setQuery(query);
Если вы хотите запросить два термина, вам нужно будет использовать boolQuery
с must
:
QueryBuilder query = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("user", "ben"))
.must(QueryBuilders.termQuery("rank", "mega"));
// and then...
SearchResponse resp = client.prepareSearch(index).setQuery(query);
Ответ 4
Кажется, что, завернув запрос (объект BoolQueryBuilder), передав его в качестве аргумента для boolQuery(). filter (..), а затем установив это в setQuery(), как вы предполагали, тогда это может быть достигнуто. Ключ "оценка" в ответе всегда равен 0 (хотя документы найдены)
Будьте осторожны! Если оценка равна 0, счет был рассчитан. Это означает, что запрос все еще находится в контексте запроса, а не в контексте фильтра. В контексте фильтра оценка равна 1,0 (без расчета) источник
Чтобы создать запрос в контексте фильтра без вычисления оценки (оценка = 1.0), выполните следующие действия (возможно, есть еще лучший способ?):
QueryBuilder qb = QueryBuilders.constantScoreQuery(QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("name", "blub)));
Это возвращает те же результаты, что и:
GET /indexName/typeName/_search
{
"filter": {
"query": {
"bool": {
"must": [
{ "match": {
"name": "blub"
}}
]
}
}
}
}
Ответ 5
Так как FilteredQueryBuilder устарел в последних версиях, вместо него можно использовать QueryBuilders.boolQuery()
, с обязательным предложением для запроса и предложением фильтра для фильтра.
import static org.elasticsearch.index.query.QueryBuilders.*;
QueryBuilder builder = boolQuery().must(termQuery("test", "test")).filter( boolQuery().must(termQuery("test", "test")));