Поиск текста по предопределенным словам - PullRequest
1 голос
/ 16 сентября 2011

Привет, у меня есть таблица базы данных, которая выглядит так

word_id int(10)
word varchar(30)

И у меня есть текст, я хочу посмотреть, какое из слов в этом тексте определено в этой таблице, какой самый элегантный способ сделать это?

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

Ответы [ 2 ]

3 голосов
/ 16 сентября 2011

Вы можете попытаться извлечь слова из текста и поместить их в запрос SELECT следующим образом:

$words = array_unique(get_words_in_text(...));
$sql = "SELECT * FROM words WHERE word IN (".implode(", ", $words)).")";

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

Вы также можете попробовать временно создать отдельную таблицу слов и добавить все слова в тексте в эту таблицу. Затем вы можете выполнить JOIN с таблицей основных слов. Если обе таблицы проиндексированы правильно, это может быть довольно быстрым.

РЕДАКТИРОВАТЬ: Этот вопрос / ответ предполагает, что создание временной таблицы действительно быстрее (см. Комментарии): mysql select .. where .. in -> optimizing . Тем не менее, это, безусловно, зависит от конкретной базы данных, которую вы используете, размера вашей таблицы слов, размера текстов и конфигурации ваших индексов. Таким образом, я рекомендую оценить оба подхода для вашего конкретного сценария. Пожалуйста, сообщите ваши результаты. : -)

0 голосов
/ 16 сентября 2011

Идея:

// get words in file into array
$file = file_get_contents('file.txt', FILE_IGNORE_NEW_LINES);
$file_words = explode(" ", $file);

// remove duplicate words, count elements in array after de-duplication
$file_words = array_unique($file_words);
$file_count = count($file_words);

// create empty array in which to store hits
$words_with_definition = array();

// check to see if each word exists in database
for ($i=0; $i < $file_count; $i++)
{
    // intentionally leaving out db connection, this is just a concept
    // word should be at least three characters, change as needed
    if (strlen($file_words[$i]) >= 3)
    {
        $sql = "SELECT word FROM your_table WHERE word='".$file_words[$i]."'";

        if (mysql_num_rows($sql) > 0)
        {
            // this is a hit, add it to $words_with_definition
            array_push($words_with_definition, $file_words[$i]);
        }
    }
}

Все, что находится в массиве $ words_with_definition, будет словами, попадающими в базу данных.

...