【发布时间】: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
}
}
所以在这里,我尝试找到 name 为 eso 的数据,type 可以是 Society或研究所
【问题讨论】:
-
你能发布原始的 ES 查询吗?
-
您是否检查过
types的值的大小写,即它们是否与您的文档中的内容相对应? -
是的,我已经检查过了
-
好的,我终于找到了解决方案。我已经在映射文件中将属性 type 的类型更改为 keyword(之前是 text),一切正常。我不明白这种行为。总而言之,这不是 java 代码的问题,而是映射的问题
标签: java elasticsearch elasticsearch-5