Я новичок в 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 с типом кто может быть общество или институт