我的代码
@Test
public void searchName(){
SearchRequest request = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());//查询所有
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchSourceBuilder.from(0);//默认0
searchSourceBuilder.size(1);//默认10 一次检索多少个结果
// 排序
searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
searchSourceBuilder.sort(new FieldSortBuilder("name").order(SortOrder.ASC));
request.indices("customer");
request.source(searchSourceBuilder);
//滚动查询 大数据时使用
request.scroll(TimeValue.timeValueMinutes(1L));//设置滚动间隔
try {
System.out.println(request.source().toString());
SearchResponse response = client.search(request);
String scrollId = response.getScrollId();// 读取返回的滚动ID,该滚动ID指向保持活动状态的搜索上下文,在下面的搜索滚动调用中将需要使用该滚动ID
response.getHits().forEach(searchHits->{
System.out.println(searchHits.getSourceAsString());
});
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
错误:
{
"error": {
"root_cause": [{
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [{
"shard": 0,
"index": "customer",
"node": "OVaxDvwtRveUofhQWfiGzw",
"reason": {
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}
}],
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}
}
},
"status": 400
}
参考:https://elasticsearch.cn/question/2050
索引中,字段不是数值型(integer、double、long)或者keyword,而是text类型的,在使用该字段进行查询、排序、聚合时候,就会出现Fielddata is disabled on text fields by default.
解决办法:
1.把改字段的索引类型改成keyword或者数值型
或者
2:索引字段类型还是text,但是加mapping中fielddata=true。这种不推荐,因为这样加载时候,占用的内存
查看字段类型发现 name 的type为text,我对name进行了排序所以报错了
解决问题:
将下面对name字段的排序删除
searchSourceBuilder.sort(new FieldSortBuilder("name").order(SortOrder.ASC));
查看字段类型
C:\Users\41997>curl -XGET "localhost:9200/customer/_mapping/"
{
"customer": {
"mappings": {
"external": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}