Вложенная сортировка работает не так, как ожидалось ElasticSearch
требование
- Сортировать продукт с помощью custom_field_values, соответствующих custom_field_id
картографирование
{
"mapping": {
"product": {
"properties": {
"user_id": {
"type": "integer"
}
"custom_field_values": {
"type": "nested",
"properties": {
"custom_field_id": {
"type": "integer"
},
"id": {
"type": "integer"
},
"value": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
}
}
Пример данных
{
{
"_type": "product",
"_source": {
"user_id": 1,
"custom_field_values": [
{ "id": 1, "custom_field_id": 1, "value": "A"},
{ "id": 2, "custom_field_id": 2, "value": "B"},
{ "id": 3, "custom_field_id": 3, "value": "C"},
]
}
},
{
"_type": "product",
"_source": {
"user_id": 2,
"custom_field_values": [
{ "id": 4, "custom_field_id": 1, "value": "Y"},
{ "id": 5, "custom_field_id": 2, "value": "Z"},
]
}
},
{
"_type": "product",
"_source": {
"user_id": 3,
"custom_field_values": [
{ "id": 6, "custom_field_id": 2, "value": "P"},
{ "id": 7, "custom_field_id": 3, "value": "Q"},
]
}
}
}
ОЖИДАЕТСЯ
- Я должен быть в состоянии сортировать весь
product
Сортировать поcustom_field_values.custom_field_id
, отсортировано поcustom_field_values.value
Пример запроса
{
"size":100,
"from":0,
"query":{
"bool":{
"filter":{
"match":{
"user_id":1
}
}
}
},
"sort":[
{
"custom_field_values.value.keyword":{
"order":"desc",
"nested":{
"path":"custom_field_values",
"filter":{
"match":{
"custom_field_values.custom_field_id": 2
}
}
}
}
}
]
}
ОБНОВЛЕНИЕ ЗАПРОСА
{
"size":100,
"from":0,
"query":{
"bool":{
"filter":{
"match":{
"user_id":1
}
}
},
"nested": {
"path": "comments",
"filter": {
"custom_field_values.custom_field_id": 2
}
}
},
"sort":[
{
"custom_field_values.value.keyword":{
"order":"desc",
"nested":{
"path":"custom_field_values",
"filter":{
"match":{
"custom_field_values.custom_field_id": 2
}
}
}
}
}
]
}
порядок следования должен быть 2nd product
, затем 3rd product
а также 1st product
, И если я хочу перебрать продукт и распечатать custom_field_values.value
Я должен получить Z
, P
, B
,
1 ответ
Решение
Итак, проблема была с данными, чувствительными к регистру. https://www.elastic.co/guide/en/elasticsearch/reference/current/normalizer.html исправил мою проблему.
"settings": {
"analysis": {
"normalizer": {
"my_normalizer": {
"type": "custom",
"char_filter": [],
"filter": ["lowercase", "asciifolding"]
}
}
}
}
Теперь мы можем использовать этот нормализатор с нашим типом поля ключевого слова:
field :field_name, type: 'keyword', normalizer: 'my_normalizer'
Надеюсь, это было полезно.