Возвращает значение, если поле отсутствует в документе Elastic search

У меня есть пользователь index. Я фильтрую пользователя по LOCATION_ID, а _source состоит из PHONE_NUMBER и USER_ID, в некоторых документах нет данных PHONE_NUMBER. Итак, он возвращает ответ с просто USER_ID. Есть ли способ получить какое-то значение по умолчанию или предопределенное значение (передавая в запросе, как мы делаем в подсчете отсутствующего поля) для поля PHONE_NUMBER в случаях, когда оно отсутствует в документе.

Отображение:

{
  "PHONE_NUMBER": {
    "type": "long",
    "store": true
  },
  "USER_ID": {
    "type": "long",
    "store": true
  },
  "LOCATION_ID": {
    "type": "long",
    "store": true
  }
}

Запрос:

{
  "_source":[
     "PHONE_NUMBER",
     "USER_ID"
  ],
  "query":{
     "bool":{
        "must":[
           {
              "terms":{
                 "LOCATION_ID":[
                    "5001"
                 ]
              }
           }
        ],
        "must_not":[
           
        ]
     }
  },
  "from":0,
  "size":2000
}

Ответ:

{
  "took":0,
  "timed_out":false,
  "_shards":{
     "total":1,
     "successful":1,
     "skipped":0,
     "failed":0
  },
  "hits":{
     "total":{
        "value":4,
        "relation":"eq"
     },
     "max_score":2.0,
     "hits":[
        {
           "_index":"user",
           "_id":"39788",
           "_score":2.0,
           "_source":{
              "USER_ID":39788
           }
        },
        {
           "_index":"user",
           "_id":"30784",
           "_score":2.0,
           "_source":{
              "USER_ID":30784,
              "PHONE_NUMBER":1234567890
           }
        },
        {
           "_index":"user",
           "_id":"36373",
           "_score":2.0,
           "_source":{
              "USER_ID":36373,
              "PHONE_NUMBER":1234567893
           }
        },
        {
           "_index":"user",
           "_id":"36327",
           "_score":2.0,
           "_source":{
              "USER_PROJECT_USER_ID":36327
           }
        }
     ]
  }
}

В приведенном выше ответе PHONE_NUMBER отсутствует в первом последнем документе. Я хочу, чтобы какое-то значение по умолчанию или предопределенное значение (установленное в запросе, например, в подсчете отсутствующего поля) возвращалось, если поле отсутствует.

Ожидаемый ответ:

{
  "took":0,
  "timed_out":false,
  "_shards":{
     "total":1,
     "successful":1,
     "skipped":0,
     "failed":0
  },
  "hits":{
     "total":{
        "value":4,
        "relation":"eq"
     },
     "max_score":2.0,
     "hits":[
        {
           "_index":"user",
           "_id":"39788",
           "_score":2.0,
           "_source":{
              "USER_ID":39788,
              "PHONE_NUMBER":9876543210.     <- Default or Predifined value (set in query, like we do in count for missing field)
           }
        },
        {
           "_index":"user",
           "_id":"30784",
           "_score":2.0,
           "_source":{
              "USER_ID":30784,
              "PHONE_NUMBER":1234567890
           }
        },
        {
           "_index":"user",
           "_id":"36373",
           "_score":2.0,
           "_source":{
              "USER_ID":36373,
              "PHONE_NUMBER":1234567893
           }
        },
        {
           "_index":"user",
           "_id":"36327",
           "_score":2.0,
           "_source":{
              "USER_PROJECT_USER_ID":36327,
              "PHONE_NUMBER":9876543210      <- Default or Predifined value (set in query, like we do in count for missing field)
           }
        }
     ]
  }
}

любая помощь будет принята с благодарностью.

0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Tldr

Этот точный результат не может быть достигнут за время запроса. Вам придется делать это во время приема пищи.

Но есть решение, которое достаточно близко во время запроса, используя runtime fields.

Решения

1. Во время приема

Вы можете настроить отображение следующим образом:

{
  "PHONE_NUMBER": {
    "type": "long",
    "store": true,
    "null_value": "9876543210" <- the specific / default number
  },
  "USER_ID": {
    "type": "long",
    "store": true
  },
  "LOCATION_ID": {
    "type": "long",
    "store": true
  }
}

Ваш документ без номера телефона теперь будет иметь значение по умолчанию. Минус в том, что он не динамичный. Вы не можете обновить это значение во время запроса.

2. Во время запроса

настраивать:

POST /_bulk
{"index":{"_index":"75278567"}}
{"USER_ID":123456,"PHONE_NUMBER":12345}
{"index":{"_index":"75278567"}}
{"USER_ID":234567,"PHONE_NUMBER":234567}
{"index":{"_index":"75278567"}}
{"USER_ID":345678}
{"index":{"_index":"75278567"}}
{"USER_ID":456789}

Используя поля времени выполнения, вы можете создать следующий запрос:

GET /75278567/_search
{
  "runtime_mappings": {
    "NUMBER": {
      "type": "keyword",
      "script": {
        "source": """
        if (doc["PHONE_NUMBER"].size() == 0){
          emit("000000")
        } else
        {
          emit(doc["PHONE_NUMBER"].value.toString())
        }
        """
      }
    }
  },
  "fields": [
    "NUMBER"
  ]
}

Это даст вам следующие результаты:

{
  "took": 5,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 4,
      "relation": "eq"
    },
    "max_score": 1,
    "hits": [
      {
        "_index": "75278567",
        "_id": "3njWAYYBArbKoMpIcXFp",
        "_score": 1,
        "_source": {
          "USER_ID": 123456,
          "PHONE_NUMBER": 12345
        },
        "fields": {
          "NUMBER": [
            "12345"
          ]
        }
      },
      {
        "_index": "75278567",
        "_id": "33jWAYYBArbKoMpIcXFp",
        "_score": 1,
        "_source": {
          "USER_ID": 234567,
          "PHONE_NUMBER": 234567
        },
        "fields": {
          "NUMBER": [
            "234567"
          ]
        }
      },
      {
        "_index": "75278567",
        "_id": "4HjWAYYBArbKoMpIcXFp",
        "_score": 1,
        "_source": {
          "USER_ID": 345678
        },
        "fields": {
          "NUMBER": [
            "000000"
          ]
        }
      },
      {
        "_index": "75278567",
        "_id": "4XjWAYYBArbKoMpIcXFp",
        "_score": 1,
        "_source": {
          "USER_ID": 456789
        },
        "fields": {
          "NUMBER": [
            "000000"
          ]
        }
      }
    ]
  }
}

Этого нет в _source, но вы можете получить доступ к значениям по умолчанию в fields.

Спасибо за ответ, Пауло, у меня это сработало с решением null_value, потому что я просто хотел вернуть один номер телефона по умолчанию для отсутствующего поля.

Divyansh Rajput 01.02.2023 12:45

Другие вопросы по теме