Для RediSearch, лучше ли создать один индекс или несколько индексов? - PullRequest
0 голосов
/ 31 января 2019

Создаю индекс, используя RediSearch в мультитенантном приложении, которое имеет:

  • 150 000 арендаторов
  • Каждый арендатор имеет в среднем 3500 клиентов
  • У каждого клиента есть 10 полей, которые будут добавлены к индексу
  • Все поля TextFields.

Вопрос в том, что было бы лучше1016 * (производительность, память / хранилище, гибкость) в таком случае?

Должен ли я создать один customer_index с полем tenant_code, чтобы помочь определить, какие данные принадлежат какому арендатору, или я должен создать индекс, специфичный для арендатора?

Исходя из моего текущего опыта и понимания, индекс конкретного арендатора будет означать много индексов, но с меньшим количеством данных, а также даст мне возможность отбрасывать и воссоздавать индекс для конкретного арендатора?

В Python код будет выглядеть следующим образом:

Индекс одного клиента

client = Client(`customer_index`)
client.create_index(
            [
                TextField('tenant_code'), TextField('last_name'), TextField('first_name'),
                TextField('other_name'), 
            ]
        )   

Индекс конкретного клиента

client = Client(`tenant_code_customer_index`)
client.create_index(
            [
                TextField('last_name'), TextField('first_name'), TextField('other_name'), 
            ]
        )

1 Ответ

0 голосов
/ 31 января 2019

Поскольку у каждого арендатора есть только 3500 клиентов (относительно мало), вам лучше использовать память, используя больший индекс.При таком небольшом количестве записей затраты ресурсов для каждого индекса, вероятно, превысят размер самого индекса.Это также увеличит количество ключей в самом Redis, так как новый ключ Redis создается для каждого индексируемого термина для каждого индекса.Таким образом, если у вас есть ~ 2000 уникальных терминов в каждой БД, вы получите 300 миллионов ключей Redis (2k * 150k).Напротив, при использовании одного индекса у вас останется только 2 тыс. Ключей.

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

Для удаления вы можете просто собрать список идентификаторов, которые соответствуют критериям, например, "FT.SEARCH idx @tenant:yourcode" и вызвать FT.DEL для каждого из них.записи индивидуально.Я предполагаю, что это не операция, которая выполняется каждые пять секунд, поэтому вы должны быть там.

Обратите внимание, что использование 150 тыс. Индексов сейчас, вероятно, даже невозможно, потому что для этого создан отдельный поток индексации.каждый индекс (хотя в следующих выпусках будет доступна опция индексирования в одном потоке).

...