Комментарии: Поиск в MySQL. Часть 2 «Поиск с учетом русской морфологии» https://valera.ws/2007.09.05~morpho_search_in_mysql/ Место публикации личных заметок. Технологии, управление, бизнес, жизнь Sat, 27 Jun 2015 10:21:15 +0000 hourly 1 https://wordpress.org/?v=5.6.2 Автор: Vitaly https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-589 Sat, 27 Jun 2015 10:21:15 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-589 И в запросе поиска AGAINST (изначальный_текст, обработанный_текст) , как писали выше, заменить запятую на пробел.

]]>
Автор: Vitaly https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-588 Sat, 27 Jun 2015 10:18:29 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-588 Спасибо за информацию, очень помогла.

Использую базу с кодировкой UTF-8, и для того чтобы всё заработало пришлось внести некоторые изменения:
1. Заменить в morphy.functions.php все strtoupper на mb_strtoupper($v, ‘UTF-8’)
2. Исправить функцию Words2AllForms как указано выше.

Но это мелочи, в остальном всё отлично прижилось :)

]]>
Автор: ev https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-529 Mon, 07 May 2012 08:46:58 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-529 модифицировал
$bulk_words = array();
foreach ( $words as $v )
if ( strlen($v) > 3 )
$bulk_words[] = mb_convert_encoding(strtoupper($v), «UTF8», «CP1251»);//конвертим в utf-8

при выводе обратно, конечно через ж…, но работает

]]>
Автор: ev https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-528 Mon, 07 May 2012 07:28:25 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-528 Notice: iconv_strlen() [function.iconv-strlen]: Detected an illegal character in input string in …\src\unicode.php on line 142
Странно все и как-то мутно, ставишь заглушку, выдает то что было

]]>
Автор: barakuda https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-461 Sat, 19 Feb 2011 02:07:22 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-461 команду $full.= implode(» «, $result); нужно заменить на

$full.= @implode(» «, $result);

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

]]>
Автор: barakuda https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-460 Sat, 19 Feb 2011 01:26:22 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-460 Вот так переписал вашу функцию…. работает и возвращает уже готовую строку всех словоформ поискового запроса склеенных в строку… и сразу пишем её в БД


/**
* Возвращает все словоформы слов поискового запроса
*
* @param string $text
* @return array
*/
function Words2AllForms($text)
{
require_once('phpmorphy/src/common.php');

// set some options
$opts = array(
// storage type, follow types supported
// PHPMORPHY_STORAGE_FILE - use file operations(fread, fseek) for dictionary access, this is very slow...
// PHPMORPHY_STORAGE_SHM - load dictionary in shared memory(using shmop php extension), this is preferred mode
// PHPMORPHY_STORAGE_MEM - load dict to memory each time when phpMorphy intialized, this useful when shmop ext. not activated. Speed same as for PHPMORPHY_STORAGE_SHM type
'storage' => PHPMORPHY_STORAGE_MEM,
// Extend graminfo for getAllFormsWithGramInfo method call
'with_gramtab' => false,
// Enable prediction by suffix
'predict_by_suffix' => true,
// Enable prediction by prefix
'predict_by_db' => true
);

$dir = 'phpmorphy/dicts';

// Create descriptor for dictionary located in $dir directory with russian language
$dict_bundle = new phpMorphy_FilesBundle($dir, 'rus');

// Create phpMorphy instance
$morphy = new phpMorphy($dict_bundle, $opts);

// All words in dictionary in UPPER CASE, so don`t forget set proper locale
// Supported dicts and locales:
// *------------------------------*
// | Dict. language | Locale name |
// |------------------------------|
// | Russian | cp1251 |
// |------------------------------|
// | English | cp1250 |
// |------------------------------|
// | German | cp1252 |
// *------------------------------*
// $codepage = $morphy->getCodepage();
// setlocale(LC_CTYPE, array('ru_RU.CP1251', 'Russian_Russia.1251'));

$words = preg_split('/ /', $text, -1, PREG_SPLIT_NO_EMPTY);

foreach ( $words as $v )
if ( strlen($v) > 3 )
{
$result = $morphy->getAllForms(strtoupper($v));
$full.= implode(" ", $result);
}

return $full;
}

]]>
Автор: barakuda https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-459 Sat, 19 Feb 2011 01:09:57 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-459 и вообще почему вы решили, что getAllForms можно скормить массив — по моему он только с одним словом работает…

mixed phpMorphy::getAllForms($word, $type = self::NORMAL)
Возвращает список всех форм (в виде массива) для СЛОВА. Если $word отождествляется с формами разных слов, словоформы для каждого слова сливаются в один массив.

?????????????

]]>
Автор: barakuda https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-458 Sat, 19 Feb 2011 00:02:21 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-458 Подскажите а почему мне Words2AllForms — ничего не возвращает.. ???
<?
$text = $_POST['text'];
if($text»)
{
echo «Все формы «;

echo Words2AllForms($text);

echo «Слова «;
echo Words2BaseForm($text);

?>

Вот результат

Все формы
Array

Слова
ЭЛЕМЕНТ ФУНКЦИЯ ТОЛЬКО ВЕДЬ ТАКЖЕ СИЛЬНЫЙ СИЛЬНО ПРОИЗВОДИТЬ ПОЛУЧАТЬ НАПОМИНАТЬ ИЗВЛЕКАТЬ ВОЗВРАЩАТЬ ПЕРВЫЙ ПЕРВОЕ НАЧАЛЬНЫЙ МАССИВ КОНЕЧНЫЙ ИЗВЛЕЧЕНИЕ ДОВОЛЬНО ДОВОЛЬНЫЙ ВСТРЯСКА ВСЕГО ВЕСЬ

]]>
Автор: Shold https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-397 Wed, 04 Mar 2009 22:15:38 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-397 Разобрался. Поправка в запрос:
SELECT SQL_CALC_FOUND_ROWS * from messages WHERE MATCH (message_text, message_words_index) AGAINST (изначальный_текст[ПРОБЕЛ]обработанный_текст_в_текстовом_формате) LIMIT 0, 10;
То есть, массив, полученный от Words2AllForms, нужно привести к строке с пробелами. Я правильно всё понял?

]]>
Автор: Shold https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-396 Wed, 04 Mar 2009 21:47:02 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-396 У мну запрос не проходит:-(
SELECT SQL_CALC_FOUND_ROWS * from messages WHERE MATCH (message_text, message_words_index) AGAINST (изначальный_текст, обработанный_текст) LIMIT 0, 10;
Так вот, «обработанный_текст» сервер в упор воспринимать не хочет. Без него всё работает, но это же не совсем правильно?… Кстати, Words2AllForms возвращает массив. Пробовал и массив в запрос вставлять, и строку. Никак:-( Help! Версия сервера: 5.0.45

]]>
Автор: Валера Леонтьев https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-381 Wed, 03 Dec 2008 15:02:13 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-381 Спасибо :)

Потому, что лень к вордпресу прикручивать свой поиск. Проще поставить гугл. Да и гугл лучше ищет, чем этот двиг на базе PHPMORPHY. И Яндекс.Сервер тоже лучше ищет. Но у обоих есть очевидные недостатки. Так что описанный выше алгоритм работает (пока) на других сайтах, например http://kadrovik.by. Там его можно вдоволь потестить, если есть желание.

]]>
Автор: Shold https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-380 Wed, 03 Dec 2008 14:54:29 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-380 Офигенный модуль! Разработчику респект!:-) Ему бы еще пару функций контент-анализа…
Как только прикручу к движку сайта — поставлю ссылку! Только одно непонятно: почему у автора в блоге поиск от Google?

]]>
Автор: веб-разработчик https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-91 Wed, 04 Jun 2008 15:27:07 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-91 Пробовал поиск с использованием phpMorphy, он не работает с UTF-8, но при помощи iconv я менял кодировку строки в cp1251, извлекал корень слова, и дальше конвертировал обратно в UTF-8. Но столкнулся с проблемой при выборке из БД, в базе текст также в UTF, и почему то конструкция приведения текста в верхний регистр отказывается работать :(

]]>
Автор: Lord NightGhost https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-88 Sun, 18 May 2008 21:14:16 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-88 Возникла аналогичная проблема с UTF-8. Хотелось бы узнать, кто как решал, если решал.

]]>
Автор: Валера Леонтьев https://valera.ws/2007.09.05~morpho_search_in_mysql/comment-page-1/#comment-41 Sun, 06 Apr 2008 07:18:41 +0000 http://valera.ws/2007.09.05~morpho_search_in_mysql/#comment-41 Честно говоря, я не пробовал эту библиотеку с UTF-8. Так что все, что могу ответить — надо пробовать и разбираться. Если PHP работает в UTF, есть подозрение, что он не сможет нормально работать с самим файлом морфологии. Возможно, проблема в этом.
Если Вы разберетесь, просьба тут отписать.

]]>