【问题标题】:Filter terms query don't work - Elasticseach and the java api过滤条件查询不起作用 - Elasticseach 和 java api
【发布时间】:2019-05-13 08:13:15
【问题描述】:

我是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
  }
}

所以在这里,我尝试找到 nameeso 的数据,type 可以是 Society研究所

【问题讨论】:

  • 你能发布原始的 ES 查询吗?
  • 您是否检查过types 的值的大小写,即它们是否与您的文档中的内容相对应?
  • 是的,我已经检查过了
  • 好的,我终于找到了解决方案。我已经在映射文件中将属性 type 的类型更改为 keyword(之前是 text),一切正常。我不明白这种行为。总而言之,这不是 java 代码的问题,而是映射的问题

标签: java elasticsearch elasticsearch-5


【解决方案1】:

问题出在映射文件中,而不是在 java 源代码中。 所以我通过将属性 type 的类型更改为 keyword(之前是 text)来更新文件,一切正常。

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2014-10-10
    • 2016-04-13
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2018-11-10
    • 2014-02-04
    • 1970-01-01
    相关资源
    最近更新 更多