【问题标题】:ElasticSearch is not sorting file names in correct orderElasticSearch 未按正确顺序对文件名进行排序
【发布时间】:2020-08-12 15:30:36
【问题描述】:

这是一个人为的例子来说明我的问题。我有一堆文件名,我想按字母顺序排序,就像 macOS 在查找器窗口中一样。

这些是我的索引文件名,按照我希望看到它们的排序顺序:

A Tribe Called Quest - Can I Kick It (1).mp3
a.png
Bcc 05.png
Birling Gap Cliffs.jpg
Durdle Door.jpg
f.png
Frost.jpg
p.png
Users order.mp4
z.png

这就是我在 Kibana 开发工具中所做的测试:

## sorting contrived example
# create the index with keyword filename for sorting
PUT /file-names
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "_doc" : {
      "properties": {
        "filename": { "type": "keyword" }
      }
    }
  }
}

# create bunch of documents
POST file-names/_doc/_bulk
{ "index":{} }
{ "filename":"A Tribe Called Quest - Can I Kick It (1).mp3" }
{ "index":{} }
{ "filename":"a.png" }
{ "index":{} }
{ "filename":"Bcc 05.png" }
{ "index":{} }
{ "filename":"Birling Gap Cliffs.jpg" }
{ "index":{} }
{ "filename":"Durdle Door.jpg" }
{ "index":{} }
{ "filename":"Frost.jpg" }
{ "index":{} }
{ "filename":"f.png" }
{ "index":{} }
{ "filename":"Users order.mp4" }
{ "index":{} }
{ "filename":"p.png" }
{ "index":{} }
{ "filename":"z.png" }

# query with sort - bugged
GET /file-names/_search
{
  "sort": {
    "filename": {
      "order": "asc"
    }
  }
}

我得到的结果是:

    "hits" : [
      {
        "_index" : "file-names",..."_score" : null,
        "_source" : {
          "filename" : "A Tribe Called Quest - Can I Kick It (1).mp3"
        },
        "sort" : [
          "A Tribe Called Quest - Can I Kick It (1).mp3"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "Bcc 05.png"
        },
        "sort" : [
          "Bcc 05.png"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "Birling Gap Cliffs.jpg"
        },
        "sort" : [
          "Birling Gap Cliffs.jpg"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "Durdle Door.jpg"
        },
        "sort" : [
          "Durdle Door.jpg"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "Frost.jpg"
        },
        "sort" : [
          "Frost.jpg"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "Users order.mp4"
        },
        "sort" : [
          "Users order.mp4"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "a.png"
        },
        "sort" : [
          "a.png"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "f.png"
        },
        "sort" : [
          "f.png"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "p.png"
        },
        "sort" : [
          "p.png"
        ]
      },
      {
        ...
        "_source" : {
          "filename" : "z.png"
        },
        "sort" : [
          "z.png"
        ]
      }
    ]

这不是我期望的顺序。由于我无法理解的原因,您可以看到“a.png”位于“Users order.mp4”下方。

任何帮助都可以按照我期望的顺序进行排序!

【问题讨论】:

标签: elasticsearch elastic-stack elasticsearch-6


【解决方案1】:

正如@Alper 所建议的,这已经是addressed

如果您出于某种原因需要坚持使用 keyword 映射,可以使用以下方法 script-sort

GET /file-names/_search
{
  "sort": {
    "_script": {
      "type": "string",
      "script": {
        "lang": "painless",
        "source": "doc['filename'].value.toLowerCase()"
      },
      "order": "desc"
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多