Подтвердить что ты не робот

Отфильтрованный запрос в API API Elasticsearch

Я немного запутался, создав фильтр-запрос в Elasticsearch Java API. Класс SearchRequestBuilder имеет метод setPostFilter, javadoc этого метода ясно говорит, что фильтр будет применяться после выполнения Query.

Однако нет метода setFilter или какого-либо другого метода, который позволит применять фильтр перед использованием запрос выполняется. Как создать фильтрованный запрос (который в основном применяет фильтр до выполнения запроса) здесь? Я что-то пропустил?

4b9b3361

Ответ 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")));