Elasticsearch nested sort - несоответствие между документом и вложенным объектом, используемым для сортировки - PullRequest
0 голосов
/ 04 февраля 2019

Я разрабатываю новый API поиска с AWS Elasticsearch (версия 6.2) в качестве бэкэнда.

Сейчас я пытаюсь поддерживать параметры сортировки для API.

Мое сопоставление выглядит следующим образом (несвязанные поля не включены):

{
  "properties": {
    "id": {
      "type": "text",
      "fields": {
        "raw": {
          "type":  "keyword"
        }
      }
    },
    "description": {
      "type": "text"
    },
    "materialDefinitionProperties": {
      "type": "nested",
      "properties": {
        "id": {
          "type": "text",
          "fields": {
            "raw": {
              "type":  "keyword"
            }
          },
          "analyzer": "case_sensitive_analyzer"
        },
        "value" : {
          "type": "nested",
          "properties": {
            "valueString": {
              "type": "text",
              "fields": {
                "raw": {
                  "type":  "keyword"
                }
              }
            }
          }
        }
      }
    }
  }
}

Я пытаюсь разрешить пользователям сортировать по значению свойства (путь: materialDefinitionProperties.value.valueLong.raw).

Обратите внимание, что он находится внутри 2-х уровней вложенных объектов (materialDefinitionProperties и materialDefinitionProperties.value являются вложенными объектами).

Чтобы отсортировать результаты по значению свойства с идентификатором «PART NUMBER», мой запросдля сортировки:

{
    "fieldName": "materialDefinitionProperties.value.valueString.raw",
    "nestedSort": {
        "path": "materialDefinitionProperties",
        "filter": {
            "fieldName": "materialDefinitionProperties.id",
            "value": "PART NUMBER",
            "slop": 0,
            "boost": 1
        },
        "nestedSort": {
            "path": "materialDefinitionProperties.value"
        }
    },
    "order": "ASC"
}

Однако, как я изучил ответ, поле «сортировка» не соответствует значению свойства документа:

{
    "_index": "material-definition-index-v2",
    "_type": "default",
    "_id": "development_LITL4ZCNE",
    "_source": {
        "id": "LITL4ZCNE",
        "description": [
            "CPU, Intel, Cascade Lake, 8259CL, 24C, 210W, B1 Prod"
        ]
        "materialDefinitionProperties": [
            {
                "id": "PART NUMBER",
                "description": [],
                "value": [
                    {
                        "valueString": "202-001193-001",
                        "isOriginal": true
                    }
                ]
            }
        ]
    },
    "sort": [
        "100-000018"
    ]
},

Свойство PART NUMBER документа равно "202-001193-001 ", в поле« сортировка »указано« 100-000018 », что является номером детали другого документа.

Кажется, что есть несоответствие между основным документом и вложенным объектом, используемым для сортировки.

Этот запрос хорошо работал, когда в кластере только небольшое количество документов.Но как только я засыпаю кластер ~ 1 миллионом записей, появляется симптом.Я также пытался создать новый кластер ES, но результаты те же.

Сортировка по другим не вложенным атрибутам работала хорошо.

Я неправильно понял концепцию вложенных объектов или неправильно использовал функцию вложенной сортировки?

Любые идеи приветствуются!

1 Ответ

0 голосов
/ 04 февраля 2019

Это ошибка в Elasticsearch.Обновление до 6.4.0 решило проблему.

Система отслеживания ошибок: https://github.com/elastic/elasticsearch/pull/32204

Примечание к выпуску: https://www.elastic.co/guide/en/elasticsearch/reference/current/release-notes-6.4.0.html

...