20 Вт одновременных поисков сегментации слов в секунду, как спроектировать архитектуру?

Java база данных

Продолжайте отвечать на вопросы планетарных друзей воды.

==

Брат Шен, у нас есть бизнес, похожий на "Поиск сегментации заголовков",параллелизмОчень большой, около 20 Вт раз в секунду,Объем данныхНе очень большой, около 500 Вт уровня, и данныене часто обновляется, который обновляется в среднем раз в день. Есть ли хороший план?

==

Это типичная проблема поиска сегментации коротких текстовых слов, просто расскажите о своем собственном опыте.

Каковы общие схемы поиска текста?

(1) метод базы данных LIKE

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

Голос за кадром: Очевидно, не применимо к этому примеру.

(2) Метод полнотекстового поиска в базе данных

Хранить титульные данные в БД и создавать полнотекстовый индекс для поиска по-прежнему просто, он использует возможности БД и не требует дополнительной разработки, но производительность низкая.

_Голос за кадром: _Параллелизм в этом примере определенно невыносим.

(3) Внешний метод индекса решения с открытым исходным кодом

Создавайте lucene, solr, ES и другие инструменты поиска с открытым исходным кодом, создавайте индексы, поддерживайте сегментацию слов и поддерживайте горизонтальное расширение объема данных и пропускной способности.

Это решение вполне может удовлетворить потребности этого примера. Однако в этом примере есть некоторые бизнес-характеристики: короткий текст и нечастые обновления.Если вы правильно используете эти две характеристики, у вас может быть более оригинальное решение.

_Голос за кадром: _Любой архитектурный проект, вышедший из строя, — хулиган.

Для функции «нечастого обновления» вы можете использовать «Причастие + ДАТ" строить планы.

Голос за кадром: Про причастие много говорить не буду.

Что такое ДАТ?

DAT — это аббревиатура от двойного массива. Это вариант дерева дерева и оптимизированная структура данных. Он может значительно сократить использование памяти при условии обеспечения эффективности поиска дерева дерева. Он часто используется для решения таких проблем, как как поиск и фильтрация информации.

Голос за кадром: Чтобы быть более конкретным, вы можете погуглить «DAT».Недостаток DAT в том, что его нужно индексировать заранее, и индекс не может обновляться в режиме реального времени.

Зачем использовать DAT, вариант дерева дерева,Можно ли использовать дерево дерева напрямую?

Преимущество trie-дерева в том, что индекс можно обновлять в режиме реального времени, а недостатком — то, что оно занимает много памяти.

В этом примере индекс не нужно обновлять в режиме реального времени, и он не может использовать преимущества дерева дерева. Однако, если короткий текст 300W строит дерево дерева и память может его уместить, вы можете использовать дерево дерева, в противном случае вы можете использовать только DAT.

универсальный,Что такое тривиальное дерево?

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

Голос за кадром: Какая структура данных подходит для какого бизнес-сценария, вы должны быть с ней досконально знакомы.

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

Голос за кадром: «Временная сложность не имеет ничего общего с порядком величины запроса». Это такой пиздец.


Например, приведенное выше дерево дерева может представлять собой набор из 5 заголовков, таких как {и, как, в, cn, com}, которые можно использовать для статистики частоты слов или поиска этих 5 строк.

Голос за кадром: при извлечении узел сохраняет doc_list, который соответствует элементу.

Нужно ли после сегментации слов сканировать дерево дерева несколько раз?

да.

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

Для характеристик «короткий текст», «данные 500 Вт» и «нечастое обновление» вы также можете использовать «сегментация слов + хэш памяти" строить планы.

Эта программа требуетСначала инициализируйте индекс:

Разметьте все короткие тексты, используя хэш слова в качестве ключа и набор doc_id в качестве значения.

процесс запросаТоже очень просто:

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

Возьмите каштан для иллюстрации.

Например:

doc1 : Я люблю Пекин

doc2: я люблю дом

doc3 : дом красивый

Первый сегмент короткого текста:

doc1 : Я люблю Пекин -> Я люблю Пекин

doc2 : Я люблю дом -> Я, люблю, дом

doc3 : дом красивый -> дом красивый

Хэшируйте сегментацию слова и создайте хеш-таблицу:

хэш (я) -> {doc1, doc2}

хеш (любовь) -> {doc1, doc2}

хеш (Пекин) -> {doc1}

хеш (дом) -> {doc2, doc3}

хеш (хороший) -> {doc3}

Таким образом, все короткие тексты инициализируются, подобно дереву дерева, и сложность запроса не имеет ничего общего с объемом текстовых данных.

Голос за кадром: Это связано только с объемом данных после сегментации, то есть с количеством сегментов хэша.

Процесс запроса выглядит следующим образом:

Если пользователь вводит «Я люблю», оно становится {Я, люблю} после сегментации слова, и извлечение памяти выполняется по хэшу каждой сегментации слова.

хеш (i) -> {doc1, doc2}

хэш(любовь)->{doc1, doc2}

Затем объедините, получите окончательный результат поиска {doc1, doc2}.

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

_Голос за кадром: _Сделать индекс высокодоступным несложно, достаточно создать два идентичных хеш-индекса.

 

этонедостатокТакже очевидно, что если индекс весь в памяти и не приземлился, то все равно необходимо хранить затвердевшие короткие текстовые данные в БД, если все данные в памяти потеряны, то восстановление данных будет медленнее.

Суммировать

Короткий текст, высокий уровень параллелизма, поддержка сегментации слов, сценарии поиска, которые не требуют обновления в реальном времени, вы можете использовать:

(1) ES, бычий нож для забоя кур;

(2) Причастие + DAT(trie);

(3) сегментация слов + хэш памяти;

и так далее несколько способов решения.

Идеи важнее выводов, я надеюсь, что у каждого есть что-то получить.

Вы можете продолжать задавать вопросы и отвечать на любые вопросы.

Соответствуйте бизнесу, разрабатывайте план и поощряйте друг друга!