Сортировать похожие данные по свойству - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующие данные:

[
  {
    DocumentId": "85",
    "figureText": "General Seat Assembly - DBL",
    "descriptionShort": "Seat Assembly - DBL",
    "partNumber": "1012626-001FG05",
    "itemNumeric": "5"
  },
  {
    DocumentId": "85",
    "figureText": "General Seat Assembly - DBL",
    "descriptionShort": "Seat Assembly - DBL",
    "partNumber": "1012626-001FG05",
    "itemNumeric": "45"
  }
]

Я использую следующий запрос для получения данных:

{
  "query": {
    "bool": {
      "must": {
        "match": {
          "DocumentId": "85"
        }
      },
      "should": [
        {
          "match": {
            "figureText": {
              "boost": 5,
              "query": "General Seat Assembly - DBL",
              "operator": "or"
            }
          }
        },
        {
          "match": {
            "descriptionShort": {
              "boost": 4,
              "query": "Seat Assembly - DBL",
              "operator": "or"
            }
          }
        },
        {
          "term": {
            "partNumber": {
              "boost": 1,
              "value": "1012626-001FG05"
            }
          }
        }
      ]
    }
  }
}

В настоящее время он возвращает элемент с "itemNumeric" = 45 иЯ хотел бы получить itemNumeric = "5" (самый низкий).

Существуют ли подсказки для этого?Я пытался с "sort": [{"itemNumeric": "desc"}]

Thx

1 Ответ

0 голосов
/ 17 октября 2018

Глядя на свой комментарий, вы можете решить проблему двумя способами.

Решение 1: Обновление сопоставления, чтобы ваш запрос теперь работал как ожидалось

PUT my_index/_mapping/_doc
{
  "properties": {
    "itemNumeric": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

Решение 2: Проверьте сопоставлениеваше поле itemNumeric в случае, если ваше отображение было создано динамически, ваше поле itemNumeric было бы многопольным.

"itemNumeric": {
    "type": "text",
     "fields": {
         "keyword": { 
             "type":  "keyword"
         }
     }
 }

В этом случае вы можете применить логику сортировки к полю itemNumeric.keyword.

"sort":[{"itemNumeric.keyword":"desc"}]

В эластичном поиске, когда у вас есть текстовые данные, всегда рекомендуется создавать два поля для него.Один тип text, чтобы вы могли применять полнотекстовые запросы, а другой тип keyword, чтобы вы могли использовать, если реализовать сортировку или какие-либо операции агрегирования.

Решение 1 не рекомендуется, поскольку в официальной документации ES ниже указана причина.

Fielddata по умолчанию отключено в текстовых полях.Установите fielddata=true на [your_field_name], чтобы загрузить полевые данные в память, инвертировав инвертированный индекс.Note that this can however use significant memory.

Я бы посоветовал прочитать о мультиполе и полевых данных , чтобы у вас было больше ясности в том, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...