python whoosh слишком долго, чтобы проиндексировать большой файл - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть CSV-файл с ~ 9 миллионами строк.Я хочу, чтобы можно было быстро найти строку из этого файла.Я решил использовать python whoosh для индексации этих данных, а затем выполнить поиск, как показано ниже.

schema = Schema(content=TEXT(stored=True, analyzer=RegexTokenizer() | LowercaseFilter() | CharsetFilter(accent_map)))

if not os.path.exists("index"):
    os.mkdir("index")
ix = create_in("index", schema)

ix = open_dir("index")

writer = ix.writer()

with open(file_path, 'r', encoding='utf-8') as file:
    for line in file:
        writer.add_document(content=line)

writer.commit()

Я не уверен, является ли это правильным / быстрым способом индексации данных.Делает ли изменение схемы ускорение индексации?Если нет, то является ли общая идея использования whoosh или других библиотек индексации хорошей для файлов такого большого размера?

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

Это пример моего csv:

ID,TYPE,TEXT,ID2
1058895,1,Be,1067806
1058895,2,Hosl,101938
1058895,3,370,None
1058895,4,Tnwg,10582

1 Ответ

0 голосов
/ 09 марта 2019

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

По сравнению с Lucene и его экосистемой (Solr, Elasticsearch) индексирование Whoosh происходит очень медленно.После некоторого быстрого тестирования на моем компьютере, он индексирует около 540 строк в секунду.Можно ожидать, что 9 миллионов строк будут проиндексированы примерно за 4,5-5 часов.Чем больше полей вы добавите, особенно полей, которые будут проанализированы, тем дольше это займет, поэтому убедитесь, что вы анализируете только необходимые поля и индексируете только то, что вам нужно.

Если вы планируете запрашивать этот индекс много разтогда затраты времени могут быть оправданы, а ваши запросы должны быть достаточно быстрыми.Если вам нужно часто индексировать большие файлы и вы не можете ждать 5 часов каждый раз, подумайте о переключении на Lucene, Solr или Elasticsearch.

Ваши данные также кажутся довольно простыми.Запрос Pandas позволяет вам искать DataFrame намного быстрее, если точных логических запросов будет достаточно.Pandas предлагает быстрые векторизованные методы для основной обработки текста, которые вы можете использовать для таких вещей, как строчные буквы, удаление стоп-слов, сопоставление символов и регулярные выражения.

Полнотекстовый поиск вам действительно нужен только в том случае, если вам нужны средства скоринга и НЛП, такие как определение и разбиение слов.

...