Отношение родителей и детей в Elasti c Поиск 7,5 - PullRequest
0 голосов
/ 22 января 2020

Я новичок в " Elasti c Поиск " и в настоящее время пытаюсь понять, как ES поддерживает отношения " Parent-Child ". Я начал со следующей статьи:

https://www.elastic.co/blog/managing-relations-inside-elasticsearch

Но эта статья основана на старой версии ES, и в настоящее время я использую ES 7.5, в которой говорится:

Поле _parent было удалено в пользу поля соединения.

В настоящее время я следую этой статье:

https://www.elastic.co/guide/en/elasticsearch/reference/7.5/parent-join.html

Однако я не могу получить желаемый результат.

У меня есть сценарий, в котором у меня есть два индекса: «Человек» и «Дом». Каждый «Человек» может иметь несколько «Домов», которые в основном являются отношением «один ко многим». Проблема в том, что когда я запрашиваю выборку всех домов, чей родитель - «XYZ», ответом будет ноль.

Ниже приведены структура моих индексов и поисковый запрос:

Индекс личности:

Запрос URL: http://hostname/person

{
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "person_home": {
                "type": "join",
                "relations": {
                    "person": "home"
                }
            }
        }
    }
}

Домашний индекс:

Запрос URL: http://hostname/home

{
    "mappings": {
        "properties": {
            "state": {
                "type": "text"
            },
            "person_home": {
                "type": "join",
                "relations": {
                    "person": "home"
                }
            }
        }
    }
}

Добавление личных данных Индекс

URL-адрес запроса: http://hostname/person/_doc/1

{
    "name": "shujaat",
    "person_home": {
        "name": "person"
    }
}

Добавление данных в домашний индекс

URL-адрес запроса: http://hostname/home/_doc/2?routing=1&refresh

{
    "state": "ontario",
    "person_home": {
        "name": "home",
        "parent": "1"
    }
}

Запрос для извлечения данных: (Для извлечения всех записей, кто является родителем с идентификатором человека "1")

URL запроса: http://hostname/person/_search

   {
    "query": {
        "has_parent": {
            "parent_type": "person",
            "query": {
                "match": {
                    "name": "shujaat"
                }
            }
        }
    }
}

ИЛИ

{
    "query": {
        "has_parent": {
            "parent_type": "person",
            "query": {
                "match": {
                    "_id": "1"
                }
            }
        }
    }
}

Ответ:

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 0,
            "relation": "eq"
        },
        "max_score": null,
        "hits": []
    }
}

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

1 Ответ

1 голос
/ 23 января 2020

Вы должны поместить родительский и дочерний документы в один и тот же индекс :

Тип данных соединения - это специальное поле, которое создает отношения родитель / потомок в документах с одним и тем же индексом. .

Таким образом, отображение будет выглядеть следующим образом:

PUT http://hostname/person_home
{
    "mappings": {
        "properties": {
            "name": {
                "type": "text"
            },
            "state": {
                "type": "text"
            },
            "person_home": {
                "type": "join",
                "relations": {
                    "person": "home"
                }
            }
        }
    }
}

Обратите внимание, что оно имеет оба поля из ваших исходных person и home индексов.

Остальная часть вашего кода должна работать просто отлично. Попробуйте вставить документы person и home в один и тот же индекс person_home и использовать запросы, которые вы отправили в вопросе.

Что если объекты person и home имеют перекрывающиеся имена полей?

Допустим, у обоих типов объектов есть поле name, но мы хотим индексировать и запрашивать их отдельно. В этом случае мы можем придумать такое отображение:

PUT http://hostname/person_home
{
    "mappings": {
        "properties": {
            "person": {
                "name": {
                    "type": "text"
                }
            },
            "home": {
                "name": {
                    "type": "keyword"
                },
                "state": {
                    "type": "text"
                }
            },
            "person_home": {
                "type": "join",
                "relations": {
                    "person": "home"
                }
            }
        }
    }
}

Теперь нам нужно изменить структуру самих объектов:

PUT http://hostname/person_home/_doc/1
{
    "name": "shujaat",
    "person_home": {
        "name": "person"
    }
}

PUT http://hostname/person_home/_doc/2?routing=1&refresh
{
    "home": {
        "name": "primary",
        "state": "ontario",
    }
    "person_home": {
        "name": "home",
        "parent": "1"
    }
}

Если вам нужно перенести старые данные из двух старых индексов в новый объединенный можно использовать reindex API .

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...