Сортировка Elasticsearch - не получение ожидаемых результатов - PullRequest
3 голосов
/ 26 мая 2020

У меня есть данные в elasti c имя поля как «Amit 111», «amit 111», «Amit 222».

Я пытаюсь отсортировать его, используя:

   searchSourceBuilder.query(query).sort("name.keyword", SortOrder.ASC)

Он возвращает результат как: «Амит 111», «Амит 222», «амит 111»

Но мне нужны результаты как: «Амит 111», «амит 111», «Амит 222»

Помогите, пожалуйста.

Ответы [ 2 ]

3 голосов
/ 26 мая 2020

Другой подход - использовать fielddata , поскольку в поле text вы можете применить сортировку, более подробную информацию о связанном URL-адресе.

Java код для этого вам нужно изменить отображение индекса, как показано после кода java.

searchSourceBuilder.query(query).sort("name", SortOrder.ASC)

Создать индекс с включенными данными поля в поле name

{
  "mappings": {
    "properties": {
      "name": { 
        "type": "text",
        "fielddata": true
        }
      }
    }
  }

Пример индекса документы

{
  "name" : "amit 111"
}

{
  "name" : "Amit 111"
}

{
  "name" : "Amit 222"
}

Ваш поисковый запрос с сортировкой по полю name

{
    "sort": [
        {
            "name": "asc"
        }
    ]
}

Результат

 "hits": [
      {
        "_index": "key",
        "_type": "_doc",
        "_id": "1",
        "_score": null,
        "_source": {
          "name": "amit 111"
        },
        "sort": [
          "111"
        ]
      },
      {
        "_index": "key",
        "_type": "_doc",
        "_id": "2",
        "_score": null,
        "_source": {
          "name": "Amit 111"
        },
        "sort": [
          "111"
        ]
      },
      {
        "_index": "key",
        "_type": "_doc",
        "_id": "3",
        "_score": null,
        "_source": {
          "name": "Amit 222"
        },
        "sort": [
          "222"
        ]
      }
    ]
1 голос
/ 26 мая 2020

полей ключевых слов хранятся в том виде, в каком они есть, поэтому сортировка по полям ключевых слов чувствительна к регистру. Нормализатор с фильтром в нижнем регистре может использоваться для индексации полей ключевых слов.

Свойство нормализатора поля ключевых слов аналогичны анализатору, за исключением того, что они гарантируют, что цепочка анализа производит единственный токен.

Сопоставление:

{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "normalizer": "my_normalizer"
          }
        }
      }
    }
  }
}

Запрос: Сортировка по имени.ключевому слову и запросу термина по имени.ключевое слово будет без учета регистра

{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "name.keyword": {
        "order": "asc"
      }
    }
  ]
}

Результат:"

"hits" : [
      {
        "_index" : "index84",
        "_type" : "_doc",
        "_id" : "SBvLT3IB8mx5yKbJQ7EC",
        "_score" : null,
        "_source" : {
          "name" : "Amit 111"
        },
        "sort" : [
          "amit 111"
        ]
      },
      {
        "_index" : "index84",
        "_type" : "_doc",
        "_id" : "SRvLT3IB8mx5yKbJULFl",
        "_score" : null,
        "_source" : {
          "name" : "amit 111"
        },
        "sort" : [
          "amit 111"
        ]
      },
      {
        "_index" : "index84",
        "_type" : "_doc",
        "_id" : "ShvLT3IB8mx5yKbJaLFg",
        "_score" : null,
        "_source" : {
          "name" : "Amit 222"
        },
        "sort" : [
          "amit 222"
        ]
      }
    ]
...