Алгоритм предсказуемого разделения структур данных независимо от порядка их построения

Требования:

Я добавляю функцию в программу, которая строит индекс Solr. Система многопоточная, поэтому поисковые записи каждый раз будут создаваться в случайном порядке. Индекс Solr также необходимо разделить на несколько файлов, потому что, если пользователь попытается загрузить один большой файл, серверу может не хватить памяти.

Проблема:

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

Что нужно:

Я ищу алгоритм, который может быть адаптирован для этих требований. Я думаю, что мне нужно какое-то B-дерево, но я не знаю ни одного варианта B-дерева, который соответствовал бы этому конкретному набору требований.

Есть ли алгоритм или структура данных, которые могут помочь с этими требованиями?


person user489481    schedule 20.10.2017    source источник
comment
Что означает, что индексные файлы Solr должны быть одинаковыми? Вы имеете в виду, что независимо от порядка их обработки файлы должны быть идентичными? Или что содержимое файла, прочитанное и обработанное, должно дать тот же результат?   -  person Jim Mischel    schedule 20.10.2017
comment
Файлы индекса Lucene по умолчанию только добавляются, поэтому, если вы добавляете материал в другом порядке, вы получите разные файлы (внутренний docid также будет другим). Вы можете самостоятельно создать кодек для сериализации и десериализации контента. Не могли бы вы уточнить, почему у вас есть эти требования? Вы сами строите индекс Lucene вне Solr и как вы его строите? Можете ли вы создать структуру на диске и в памяти, а затем последовательно сериализовать эту структуру в Lucene? В этом случае будет работать наличие двоичного дерева в каждом потоке, а затем объединение его на диск.   -  person MatsLindh    schedule 21.10.2017
comment
Файлы индекса Solr должны быть одинаковыми, я имею в виду, что сами файлы должны быть идентичными. Эти требования должны доказать надежность и целостность программы. Я не знаю, как создаются индексы Solr, потому что мы еще не так далеко от планирования. Однако я могу сказать, что эти файлы будут в формате JSON. Мы можем создавать структуры на диске и в памяти, как захотим, при условии, что результирующие файлы непротиворечивы.   -  person user489481    schedule 23.10.2017
comment
Я думаю, что здесь есть некоторая путаница с индексом Lucene, и в целом вопрос не имеет большого смысла с точки зрения Lucene/Solr. Приложение должно полагаться на то, как Lucene управляет сегментами индекса и как оно их объединяет. Я рекомендую изучить политику слияния, если вы действительно хотите узнать больше о том, как объединяются сегменты Lucene. Хотите настроить кластер? и маршрутные документы? и реплицировать индекс через ? Однако неясно, может ли SolrCloudp[1] помочь? [1] lucene.apache.org/solr/guide/6_6/solrcloud.html   -  person Alessandro Benedetti    schedule 24.10.2017


Ответы (1)


Используйте UUID на основе содержимого. Для разделения файла отправьте каждый элемент в ведро на основе диапазона, в который попадает UUID. Независимо от того, в каком порядке вы получаете элементы, это надежно отправит его в ведра с относительно ровными размерами, а уникальный индекс гарантирует, что результат выходит так же.

См. https://wiki.apache.org/solr/UniqueKey для получения более подробных рекомендаций и https://wiki.apache.org/solr/LargeIndexes и другие полезные советы.

person btilly    schedule 20.10.2017