Как применить фильтр, только если существует вложенное отображение - PullRequest
2 голосов
/ 09 апреля 2020

Я пытаюсь применить радиус местоположения к вложенному запросу ES, но вложенное значение не присутствует все время, вызывая исключение

"[nested] nested object under path [contact.address] is not of nested type"

Я пытался проверить, существует ли свойство, затем применить фильтр, но ничего не помогло до сих пор

Отображение имеет вид:

{
  "records": {
    "mappings": {
      "user": {
        "properties": {
          "user_id": {
            "type": "long"
          },
          "contact": {
            "properties": {
              "address": {
                "properties": {
                  "city": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "location": {
                    "properties": {
                      "lat": {
                        "type": "long"
                      },
                      "lng": {
                        "type": "long"
                      },
                      "lon": {
                        "type": "text",
                        "fields": {
                          "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                          }
                        }
                      }
                    }
                  }
              },
              "email": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "name": {
                "properties": {
                  "first_name": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  },
                  "last_name": {
                    "type": "text",
                    "fields": {
                      "keyword": {
                        "type": "keyword",
                        "ignore_above": 256
                      }
                    }
                  }
                }
              }
            }
          },
          "created_at": {
            "type": "date"
          }
        }
      }
    }
  }
}

, и иногда записи не имеют данных о местоположении или адресе, что приводит к проблемам. пример записи:

{
   "contact": {
      "name": {
        "first_name": "Test",
        "last_name": "User"
       },
        "email": "test@user.com",
        "address": {}
    },
    "user_id": 532188
}

вот что я пытаюсь:

GET records/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "exists": {
            "field": "contact.address"
          }
        },
        {
          "exists": {
            "field": "contact.address.location"
          }
        }
      ],
      "minimum_should_match": 1,
      "should": [
        {
          "bool": {
            "filter": {
              "nested": {
                "ignore_unmapped": true,
                "path": "contact.address",
                "query": {
                  "geo_distance": {
                    "distance": "50mi",
                    "contact.address.location": {
                      "lat": 51.5073509,
                      "lon": -0.1277583
                    }
                  }
                }
              }
            }
          }
        }
      ]
    }
  }
}

1 Ответ

1 голос
/ 09 апреля 2020

Вам необходимо определить правильное отображение с типом данных nested, чтобы избежать этой проблемы, выглядит динамично c Отображение создает некоторую проблему.

Я определил свое собственное сопоставление с типом данных nested, и даже когда я пропускаю некоторые данные во вложенных полях, он не жалуется.

Индекс по умолчанию

{
    "mappings": {
        "properties": {
            "user_id": {
                "type": "long"
            },
            "contact": {
                "type": "nested"
            }
        }
    }
}

Пример индекса do c

{
   "contact": {
      "name": {
        "first_name": "raza",
        "last_name": "ahmed"
       },
        "email": "opster@user.com",
        "address" :{ --> note empty nested field
        }

    },
    "user_id": 123456
}

Индекс другого do c с данными во вложенном поле

{
   "contact": {
      "name": {
        "first_name": "foo",
        "last_name": "bar"
       },
        "email": "opster@user.com",
        "address": {
            "location" :{. --> note nested data as well
                "lat" : 51.5073509,
                "lon" : -0.1277583
            }
        }
    },
    "user_id": 123456
}

Индекс другого do c , в котором нет даже пустых nested данных

{
   "contact": {
      "name": {
        "first_name": "foo",
        "last_name": "bar"
       },
        "email": "opster@user.com"
    },
    "user_id": 123456
}

Поисковый запрос с использованием поля nested

{
    "query": {
        "nested": {
            "path": "contact", --> note this
            "query": {
                "bool": {
                    "must": [
                        {
                            "exists": {
                                "field": "contact.address"
                            }
                        },
                        {
                            "exists": {
                                "field": "contact.name.first_name"
                            }
                        }
                    ]
                }
            }
        }
    }
}

В результате поиска не появляются жалобы на документы, которые не t включает вложенный do c (запрос, который вызывает у вас проблемы)

"hits": [
      {
        "_index": "nested",
        "_type": "_doc",
        "_id": "3",
        "_score": 2.0,
        "_source": {
          "contact": {
            "name": {
              "first_name": "foo",
              "last_name": "bar"
            },
            "email": "opster@user.com",
            "address": { --> note the nested doc
              "location": {
                "lat": 51.5073509,
                "lon": -0.1277583
              }
            }
          },
          "user_id": 123456
        }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...