ElasticSearch не сортирует имена файлов в правильном порядке

Это надуманный пример, чтобы проиллюстрировать мою проблему. У меня есть куча имен файлов, которые я хотел бы отсортировать по алфавиту так же, как 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 по причинам, которые я не могу понять.

Любая помощь приветствуется, чтобы сортировка работала в том порядке, в котором я ожидаю!


person user3895395    schedule 12.08.2020    source источник
comment
см.: stackoverflow.com/questions/33382734/   -  person alpert    schedule 12.08.2020


Ответы (1)


Как предложил @Alper, это уже было решено .

Если вам по какой-то причине нужно придерживаться сопоставления keyword, вот как вы можете сортировка по сценарию:

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