2013-10-08 4 views
2

У меня есть 2 000 000 строк в моей базе данных mysql. Теперь, когда в качестве ввода вводится новая строка, я пытаюсь выяснить, есть ли строка в моей базе данных, иначе я вставляю строку.Соответствие позиции независимой строке

Определение струнного матча

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

Ex - Ram мальчик И мальчик Рам будет сказано, чтобы соответствовать. Рам хороший мальчик не будет соответствовать.

PS - Пожалуйста, игнорируйте чувство

Теперь мой вопрос, что это лучший способ сделать это, соответствующие данному количество строк (2000000) Я должен соответствовать.

Решение я мог думать:

  1. индекс всех строк в ГУМЗ/Sphinx
  2. На новый поиск, я просто хит сервер поиска и должны рассмотреть на максимум 10 лучших строк

Преимущества: -

  1. быстрее, чем тузд полнотекстового поиска

Недостатки: -

  1. Ведение поиска сервера обновляется с новыми запросами в тузд базе данных.

Есть ли другие лучшие решения, на которые я могу пойти? Любые предложения и подход к решению этой проблемы наиболее приветствуются :)

Спасибо!

ответ

2

Вы можете просто вычислить второй столбец со словами в отсортированном порядке. ТОГДА просто уникальный индекс по этому столбцу :)

ALTER TABLE table ADD sorted varchar(255) not null, unique index(sorted); 

тогда ... (PHP для удобства, но и другие языки будут похожи)

$words = explode(' ',trim($string)); 
sort($words); 
$sorted = mysql_real_escape_string(implode(' ',$words)); 
$string = mysql_real_escape_string($string); 

$sql = "INSERT IGNORE INTO table SET `string`='$string',`sorted`='$sorted'"; 
+0

Это потрясающая идея :) –

+0

сортировать слова, складывать футляр, удалять дубликаты – ChuckCottrill

+0

mysql collations, вероятно, позаботится о складном футляре для вас :) – barryhunter

0

Рассчитайте цветной фильтр для каждой строки, добавив все слова в фильтр для данной строки. В любом новом поиске строк, вычислите фильтр цветения и найдите соответствующие строки в БД.

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

+0

Можете ли вы быть немного более описательный, пожалуйста? –

1

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

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

accommodate fuzzy matching

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

EDIT-1

в вашем случае, если вы будете есть 3 таблицы. у вас уже есть, где у вас есть 2 000 000 строковых сообщений. теперь еще две таблицы, о которых я говорил, таковы. Вторая таблица для хранения всех уникальных выражений (уникальное слово по всем сообщениям) Третья таблица для хранения связи между каждым выражением (word) и messgae, в котором появляется слово. см. Ниже результаты запроса.

enter image description here

enter image description here

Теперь давайте говорить ваш вход имеет строку "Is Boy Ram" первый экстракт Каждое выражение из строки у вас есть 3 в этой строке. «Есть» и «Рам» и «Мальчик». теперь просто вопрос завершения запроса Select, чтобы увидеть, существуют ли все эти выражения в последней таблице. «MyData_ExpressionString» для одиночного StringID. Думаю, теперь у вас лучшая картина, и вы знаете, что делать дальше. и да, я не создал индексы, но я думаю, вы уже знаете, какие индексы вам понадобятся.

+0

Я не получаю ваше решение в этом посте. Можете ли вы рассказать о некоторых примерах, связанных с этим делом? –

+0

Обновлен ответ в Edit-1. –

+0

Эй, я думаю, в этом методе вы закончите картографирование Рам-мальчика, чтобы Рам был мальчиком и т. Д.? В любом случае, Большое спасибо за помощь :) –

Смежные вопросы