elasticsearch text字段排序报错解决
使用elasticsearch 进行排序的时候,我们一般都会排序数字、日期。但是在排序text类型的时候就会出现错误。GET xytest/sutdent/_search{ "sort":[ {"region": {"order": "asc"}} ] , "from": 0 , "size": 2}结果如下:{ "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory." } ], "type": "search_phase_execution_exception", "reason": "all shards failed", "phase": "query", "grouped": true, "failed_shards": [ { "shard": 0, "index": "xytest", "node": "6h-7wPJmQqWGfz6nbgqjjQ", "reason": { "type": "illegal_argument_exception", "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory." } } ], "caused_by": { "type": "illegal_argument_exception", "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory." } }, "status": 400}主要原因是:"Fielddata is disabled on text fields by default. Set fielddata=true on [region] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html方案一:我们可以用region.keyword进行聚合,排序。用region用来查询。那么我们对我们的查询进行修改GET xytest/sutdent/_search{ "sort":[ {"region.keyword": {"order": "asc"}} ] , "from": 0 , "size": 2}修改后查询结果:{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 6, "max_score": null, "hits": [ { "_index": "xytest", "_type": "sutdent", "_id": "6", "_score": null, "_source": { "sid": "00006", "name": "牧琢杭", "age": "26", "region": "广东省 湛江市 赤坎区", "grade": [ { "数学": 80 }, { "语文": 63 }, { "英语": 90 } ] }, "sort": [ "广东省 湛江市 赤坎区" ] }, { "_index": "xytest", "_type": "sutdent", "_id": "5", "_score": null, "_source": { "sid": "00005", "name": "范旭", "age": "30", "region": "新疆维吾尔自治区 和田地区 和田县", "grade": [ { "数学": 90 }, { "语文": 69 }, { "英语": 60 } ] }, "sort": [ "新疆维吾尔自治区 和田地区 和田县" ] } ] }}方案二:这是region这个排序字段的fileddata为true。PUT xytest/_mapping/sutdent{ "properties": { "region":{ "type": "text", "fielddata": true } }}设置结果:{ "acknowledged": true}我们再次运行最开始的查询:GET xytest/sutdent/_search{ "sort":[ {"region": {"order": "asc"}} ] , "from": 0 , "size": 2}返回结果:{ "took": 130, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 6, "max_score": null, "hits": [ { "_index": "xytest", "_type": "sutdent", "_id": "6", "_score": null, "_source": { "sid": "00006", "name": "牧琢杭", "age": "26", "region": "广东省 湛江市 赤坎区", "grade": [ { "数学": 80 }, { "语文": 63 }, { "英语": 90 } ] }, "sort": [ "东" ] }, { "_index": "xytest", "_type": "sutdent", "_id": "4", "_score": null, "_source": { "sid": "00004", "name": "符龙", "age": "37", "region": "河北省 保定市 清苑县", "grade": [ { "数学": 80 }, { "语文": 79 }, { "英语": 69 } ] }, "sort": [ "保" ] } ] }}