Я не думаю, что ваша основная проблема здесь - это тип базы данных, которую вы используете, но тот факт, что у вас на самом деле нет «индекса» для поиска: сходство между документами.
Мое предложение состоит в том, чтобы один раз определить, какие 10 документов похожи на каждый из 100.000 doc_ids и кеш результат в новой таблице, подобной этой:
doc_id(integer)-similar_doc(integer)-score(integer)
, где вы вставите 10 строк в каждый документ, каждый из которых представляет 10 лучших совпадений для него. Вы получите 400 000 строк, к которым вы можете получить прямой доступ по индексу, который должен сократить время поиска до чего-то вроде O (log n) (в зависимости от реализации индекса).
Затем при каждой вставке или удалении документа (или одного из его значений) вы просматриваете документы и соответственно обновляете новую таблицу.
например. когда новый документ вставлен:
для каждого из документов уже в таблице
- Вы рассчитываете его счет матча и
- если оценка выше, чем самая низкая оценка аналогичных документов, кэшированных в новой таблице, которую вы меняете в аналогичном документе, и оценка вновь вставленного документа