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

问题描述

我有一个文件

如何在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',{'id':4,'name': 'Tax Accounting 200','professor': ['Thomas Baszo','finance']},{'id':5,'name': 'Capital Markets 350',{'id':6,'name': 'Theatre 410','professor': ['Sebastian Hern','art']},{'id':7,'name': 'Accounting 101',{'id':8,'name': 'Marketing 101','professor': ['William Smith','name': 'Anthropology 230','professor': ['Devin Cranford','history']},{'id':10,'name': 'Computer Science 101','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输出进行排序

  • 第二个预期输出>关于name然后是id

    排序

如何在search = es.search(index="data_new","query": {"match_all": {}}})上进行修改

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

解决方法

您可以对索引进行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是列名

,

在启用fielddata之前,请考虑为什么将文本字段用于聚合,排序或在脚本中使用。这样做通常没有任何意义。

在索引之前分析文本字段,以便可以通过搜索New Yorknew来找到类似york的值。当您可能需要一个名为new

的存储桶时,此字段上的字词聚合将返回一个york存储桶和一个New 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":{
     
     }
   }
}

请参见

https://www.elastic.co/guide/en/elasticsearch/reference/current/fielddata.html https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.html