Фильтр условий запроса не работает - Elasticseach и Java API - PullRequest
0 голосов
/ 12 декабря 2018

Я новичок в stackoverflow

вот моя проблема

Я хочу сделать запрос в ES, который сначала выполняет должен , а затем фильтр .В SQL это должно выглядеть примерно так:

SELECT * FROM table WHERE name = "the_name" AND type IN ("type1", "type2")

Вот моя реализация этого случая

@Override
public List<Example> findByName(String pattern, String... types) {
    // Prepare query
    QueryBuilder queryBuilder = QueryBuilders.boolQuery()
            .must(QueryBuilders.termQuery("name", pattern))
            .filter(QueryBuilders.termsQuery("type", types));

    // Execute query    
    return new ArrayList<>(this.elasticsearchQuery.findAgainstFields(Example.class, queryBuilder));
}

Далее моя реализация для метода findAgainstFields

@SuppressWarnings("unchecked")
@Override
public <T> List<T> findAgainstFields(Class<?> t, QueryBuilder query) {
    NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();

    NativeSearchQuery nativeSearchQuery = nativeSearchQueryBuilder
            .withIndices("my_indice")
            .withTypes(t.getSimpleName())
            .withSort(new ScoreSortBuilder().order(SortOrder.DESC))
            .withQuery(query)
            .withPageable(PageRequest.of(0, 5)).build();

    // Execute query
    return (List<T>) this.elasticsearchTemplate.queryForList(nativeSearchQuery, t);
}

И когда я запускаю проект, этот метод ( findByName ) возвращает пустой массив.Однако когда я удалил .filter(QueryBuilders.termsQuery("type", types)), я получил результат.Итак, в какой части я не прав?

Заранее спасибо

ps: я использую ES 5.5 и Java 8 oracle

ОБНОВЛЕНИЕ

ES запрос выглядит так:

{
  "bool" : {
    "must" : [
      {
        "term" : {
          "name" : {
            "value" : "eso",
            "boost" : 1.0
          }
        }
      }
    ],
    "filter" : [
      {
        "terms" : {
          "type" : [
            "Society",
            "Institut"
          ],
          "boost" : 1.0
        }
      }
    ],
    "disable_coord" : false,
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

Итак, здесь я пытаюсь найти данные с именем как eso с типом кто может быть общество или институт

1 Ответ

0 голосов
/ 12 декабря 2018

проблема была в файле сопоставления, а не в исходном коде Java.поэтому я обновил файл, изменив тип свойства type на ключевое слово (раньше было text ), и все отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...