如何在特定字段上使用排序

我有一个文件


如何在elasticsearch上的特定字段上使用排序


我的查询如下


{

   "sort":{

      "name":"desc"

   },

   "from":10,

   "size":149,

   "query":{

      "match_all":{

         

      }

   }

}

我收到错误


Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index. Note that this can use significant memory.')\"}" }


我的索引名称是 data_new


下面是插入索引的代码


test = [   {'id':1,'name': 'Cost Accounting 400', 'professor': ['Bill Cage', 'accounting']},

    { 'id':2,  'name': 'Computer Internals 250', 'professor': ['Gregg Payne', 'engineering']},

    {'id':3,   'name': 'Accounting Info Systems 350',   'professor': ['Bill Cage', 'accounting']},

    {'id':4,'name': 'Tax Accounting 200', 'professor': ['Thomas Baszo', 'finance']},

    {'id':5,'name': 'Capital Markets 350', 'professor': ['Thomas Baszo', 'finance']},

    {'id':6,'name': 'Theatre 410', 'professor': ['Sebastian Hern', 'art']},

    {'id':7,'name': 'Accounting 101', 'professor': ['Thomas Baszo', 'finance']},

    {'id':8,'name': 'Marketing 101', 'professor': ['William Smith', 'finance']},

    {'id':8,'name': 'Anthropology 230', 'professor': ['Devin Cranford', 'history']},

    {'id':10,   'name': 'Computer Science 101',

        'professor': ['Gregg Payne', 'engineering']}]

from elasticsearch import Elasticsearch

import json

es = Elasticsearch()

es.indices.create(index='data_new', ignore=400)

for e in test:

        es.index(index="data_new", body=e, id=e['id'])

search = es.search(index="data_new", body={"from" : 0, "size" : 2,"query": {"match_all": {}}})

search['hits']['hits']

预计出


我的第一个预期输出>我需要对输出进行name排序


第二个预期输出 > 相对于namethen排序id


如何进行修改search = es.search(index="data_new", body={"from" : 0, "size" : 2,"query": {"match_all": {}}})


https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.html我浏览了没有帮助的网址


FFIVE
浏览 138回答 2
2回答

侃侃尔雅

在启用之前fielddata,请考虑为什么要使用文本字段进行聚合、排序或在脚本中使用。这样做通常没有意义。在建立索引之前会分析文本字段,以便可以通过搜索或 forNew York找到类似的值。当您可能需要一个名为newyorknewyorkNew York相反,您应该有一个用于全文搜索的文本字段,以及一个启用聚合的未分析关键字字段doc_values,如下所示:PUT data_new{  "mappings": {    "properties": {      "name": {         "type": "text",        "fields": {          "keyword": {             "type": "keyword"          }        }      }    }  }}name.keyword 我想您已经可以使用如下所示将名称视为关键字,GET /data_new/_search{  "sort" : [     { "name.keyword" : {"order" : "asc"}}  ], "from":10, "size":149, "query":{   "match_all":{          }   }}

catspeake

您可以对索引发出 PUT 请求以将 fielddata 设置为 true:curl --location --request PUT 'http://localhost:9200/index_name/info/_mapping' \--header 'Content-Type: application/json' \--data-raw '{  "properties": {     "desc": {        "type":     "text",       "fielddata": true     }  }}'desc列名在哪里
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python