#python #mysql #elasticsearch
#python #mysql #elasticsearch
Вопрос:
Допустим, у нас есть около 3 миллионов документов по одной странице каждый. Я хочу импортировать весь текст в базу данных MySQL. Для того, что я читаю, я могу добавить его в виде текстового поля (65535 символов). Моя задача заключается в следующем: мы ежедневно получаем документы, которые немного или идентичны одному из документов 3M, которые у нас есть. Есть ли способ или структура, которая может выполнять поиск блока текста в тексте MySQL, когда входной текст не идентичен? Мне нужно знать, есть ли у нас один или несколько документов, которые точно соответствуют полученному. В идеальном мире я хотел бы получить результат, который ближе соответствует тексту поиска…
Результирующий механизм для этого может включать MySQL и Python в качестве решения. Я нигде не могу найти, что может быть лучшим подходом для этого, и поиск этого не займет целую вечность.
[Отредактировано 2020-09-29] Из того, что я нашел на данный момент, похоже, что хорошим направлением для решения проблем такого типа может быть использование Elasticsearch, как указал Сабик.
[Отредактировано 2020-12-14] Мы, наконец, попробовали ElasticSearch, и это определенно хорошее решение. Одна вещь, которую мы нашли не идеальной, — это тот факт, что мы хотим искать в документах, но если ни один документ не находится достаточно близко, мы хотели бы иметь аналогичный результат, и похоже, что это не так, как это работает. Он всегда возвращает документ, и оценка не имеет значения. Вероятно, мы будем вручную сравнивать наилучшее соответствие с искомым документом, чтобы получить собственный показатель сходства.
Комментарии:
1. Я полагаю, что вы хотите сделать, это выполнить поиск определенного типа шаблона в MySQL, верно? Вы можете использовать функцию регулярного выражения.
2. И да. Если вы не хотите дублировать данные, вы можете просто назначить ПЕРВИЧНЫЙ КЛЮЧ этому полю.
3. Есть ли способ или структура, которая может выполнять поиск блока текста в тексте MySQL, когда входной текст не идентичен? Такого встроенного инструмента нет. И я не вижу способа эффективно выполнить это в MySQL, потому что все алгоритмы, которые проверяют сходство текстов, являются итеративными или даже рекурсивными. Конечно, существует множество частных случаев, когда некоторый предварительный поиск может быть достаточно эффективным. Например, вы можете разделить текст на предложения или абзацы и сохранить в некоторой таблице идентификатор текста и контрольную сумму предложения / абзаца, а затем вычислить количество равных контрольных сумм для каждого текста.
4. Для поиска текстовых документов вам, вероятно, нужно что-то вроде Elasticsearch или Lucene или что-то вроде сегодняшнего эквивалента, а не MySQL; работа с текстом — это его собственная специальность, и база данных общего назначения, такая как MySQL, может хорошо подходить или не подходить для нее.
5. Да, как указал сабик, вам обязательно нужно
elasticsearch
использовать, чтобы получитьsimilar
совпадения.RDBMS
не имеет тойsearch
возможности, которую вы ищете.
Ответ №1:
Некоторое время назад я пытался сделать что-то подобное с MySQL, а затем я нашел ФАЙЛОВЫЙ ПОТОК SQL SERVER.
Я сохраняю документ в поле двоичного типа varbinary (max), которое занимает меньше места, а поиск выполняется очень быстро.
Может быть, теперь вы можете увидеть, есть ли в MySQL что-то похожее на FILESTREAM, я не исследовал это в последнее время.
Комментарии:
1. Из того, что я прочитал, FILESTREAM не может дать мне сходства, он может сравнивать только идентичные документы.