У меня есть пользователь 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)
}
}
]
}
}
любая помощь будет принята с благодарностью.
Этот точный результат не может быть достигнут за время запроса. Вам придется делать это во время приема пищи.
Но есть решение, которое достаточно близко во время запроса, используя runtime fields
.
Вы можете настроить отображение следующим образом:
{
"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
}
}
Ваш документ без номера телефона теперь будет иметь значение по умолчанию. Минус в том, что он не динамичный. Вы не можете обновить это значение во время запроса.
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, потому что я просто хотел вернуть один номер телефона по умолчанию для отсутствующего поля.