Вопросы по организации индексов

Всем привет!

Вопрос №1 - Можно ли как-то связывать вложенные объекты с документами в другом индексе или типе ?
Например:
Объекты Clients

[
    {
        "id": 1,
        "name": "client 1",
        "tags": [
            {
                "id": 1,
                "name": "tag 1"
            },
            {
                "id": 2,
                "name": "tag 2"
            }
        ],
        "deals": [
            {
                "id": 1,
                "name": "deal 1",
                "tags": [
                    {
                        "id": 1,
                        "name": "tag 1"
                    }
                ]
            }
        ]
    }
]

Объекты Deals

[
    {
        "id": 1,
        "name": "deal 1",
        "tags": [
            {
                "id": 1,
                "name": "tag 1"
            }
        ]
    },
    {
        "id": 2,
        "name": "deal 2",
        "tags": [
            {
                "id": 2,
                "name": "tag 2"
            }
        ]
    }
]

Объекты Tags

[
    {
        "id": 1,
        "name": "tag 1"
    },
    {
        "id": 2,
        "name": "tag 2"
    }
]

Вопрос №2 - Можно ли обновлять вложенные объекты если измениться оригинал ? Например, в объекте tag с id = 1 изменилось поле name на "tag 3". Можно ли силами эластика найти и поменять данный объект в других объектах ?

Вопрос №3 - Если я верно понял, то не может быть у полей в одном индексе с одинаковыми названиями разные типы данных. Но что делать если во вложенных объектах встретилось поле с другим типом данных ?
Например:

{
    "deal_id": "1",
    "client": {
        "id": "2",
        "type": "0"
    },
    "type": {
        "id": 3,
        "name": "Тип 1"
    }
}

client.type и type - абсолютно разные поля и друг с другом они не связаны, просто их так назвали.

Вопрос №4 - Сейчас сделано так что для каждого пользователя создаётся свой индекс, а в нём все уже все доступные типы(clients, deals, tags). У каждого могу быть абсолютно разные поля и разными типами данных, как в вопросе №3. Насколько верно так делать ?

Вопрос №5 - Влияет ли кол-во и размер индексов на поиск, индексацию, переиндексацию ?

Заранее благодарю за ответы.
PS. Извиняюсь что задал столько вопросов в одном посте, но они связаны между собой.

Elasticsearch связывание объектов из разных индексов не поддерживает. Это ведь поисковый движок, а не реляционная база данных.

Вопрос №2 - Можно ли обновлять вложенные объекты если измениться оригинал ? Например, в объекте tag с id = 1 изменилось поле name на "tag 3". Можно ли силами эластика найти и поменять данный объект в других объектах ?

Обновление всегда осуществляется на уровне записи, любое изменение записи требует ее полной переиндексации.

Вопрос №3 - Если я верно понял, то не может быть у полей в одном индексе с одинаковыми названиями разные типы данных. Но что делать если во вложенных объектах встретилось поле с другим типом данных ?

В вашем примере эти поля имеют разные названия. Одно поле - client.id и другое - type.id.

Вопрос №4 - Сейчас сделано так что для каждого пользователя создаётся свой индекс, а в нём все уже все доступные типы(clients, deals, tags). У каждого могу быть абсолютно разные поля и разными типами данных, как в вопросе №3. Насколько верно так делать ?

Эти типы связаны через отношение parent/child? Если да - то выбора нет - они должны быть в одном индексе. Если нет - то надо смотреть на схему, объемы данных и т. д. В идеале, лучше иметь один тип в каждом индексе, но бывают исключения.

Вопрос №5 - Влияет ли кол-во и размер индексов на поиск, индексацию, переиндексацию ?

Да

Спасибо за ответы!

Получается что во время изменения документа в типе tag, мне придётся пробегаться по всем документам(где этот tag использовался) в данном индексе, искать совпадения и обновлять их ?

В примере имелось ввиду поле "type", в client оно long, а в общем объекте оно object. Эластик на это ругается.

А в какую сторону ? При большем количестве индексов страдает производительность ?

Что такое client и type? У вас в одном примере это были вложенные поля, в другом - типы. Вы не могли бы привести пример curl команд, которые демонстрировали бы проблему.

Это очень сложный вопрос, и ответ, во многом, зависит от того, о какой производительности вы говорите. Тут слишком много параметров. Больше индексов при том же количестве записей в кластере? Больше индексов и больше записей? Больше индексов, и больше записей, но записи меньше? Поиск по одному индексу или по всем одновременно? Как измеряется производительность - как пропускная способность и латентность поиска или пропускная способность индексации?...

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.