如何在特定字段上使用进行排序 [英] How to do sort in using on particular field

查看:431
本文介绍了如何在特定字段上使用进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个文档

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

How to do sort in using on particular field on elasticsearch

我的查询在下面

{
   "sort":{
      "name":"desc"
   },
   "from":10,
   "size":149,
   "query":{
      "match_all":{
         
      }
   }
}

我出错了

文本字段并未针对需要按文档的字段数据(如聚合和排序)的操作进行优化,因此默认情况下将禁用这些操作。请改用关键字字段。或者,在[name]上设置fielddata = true,以通过反转取反的索引来加载字段数据。请注意,这可能会占用大量内存。’)\''}'' }

我的索引名是data_new

My index name is 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

第二个预期输出>来对输出进行排序;按照名称排序,然后 id

Second Expected Output > sort with respect to name then id

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

我通过了网址 https:/ /www.elastic.co/guide/zh-CN/elasticsearch/reference/6.8/search-request-sort.html 这无济于事

I went through the url https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.html which is not helping

推荐答案

在启用 fielddata 之前,请考虑为什么将文本字段用于聚合,排序或在脚本中使用。

Before you enable fielddata, consider why you are using a text field for aggregations, sorting, or in a script. It usually doesn’t make sense to do so.

在索引之前分析文本字段,以便可以像 New York 这样的值进行索引。通过搜索 new york 可以找到。当您可能希望将单个存储桶称为时,此字段上的字词汇总将返回 new 存储桶和 york 存储桶纽约

A text field is analyzed before indexing so that a value like New York can be found by searching for new or for york. A terms aggregation on this field will return a new bucket and a york bucket, when you probably want a single bucket called New York

相反,您应该有一个用于全文搜索的文本字段,以及一个具有 doc_values 启用了聚合,如下所示:

Instead, you should have a text field for full text searches, and an unanalyzed keyword field with doc_values enabled for aggregations, as follows:

PUT data_new
{
  "mappings": {
    "properties": {
      "name": { 
        "type": "text",
        "fields": {
          "keyword": { 
            "type": "keyword"
          }
        }
      }
    }
  }
}

我想您已经可以使用 name.keyword 将名称作为关键字,如下所示,

I guess you can already treat name as keyword using name.keyword like below,

GET /data_new/_search
{
  "sort" : [
     { "name.keyword" : {"order" : "asc"}}
  ],
 "from":10,
 "size":149,
 "query":{
   "match_all":{
     
     }
   }
}

请参见

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

这篇关于如何在特定字段上使用进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆