Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2011, 11:25   #1
artlayers
 
Регистрация: 04.11.2009
Сообщений: 6
По умолчанию Движок поиска для самописного сайта

Есть самописный движок, необходимо организовать поиск по БД (mysql), по двум полям - русское название и название на английском языке. При всем этом вариант типа
PHP код:
SELECT FROM name WHERE 
 en_title  LIKE 
%что-то
 OR  
ru_title LIKE %что-то
совсем не подходит. Нужен поиск умнее, который может учитывать частичные совпадения и ранжировать соответственно результаты. Например, неграмотный пользователь пишет запрос: "велосепед" такого слова в БД нет, соответственно при поиске влоб пользователь получит ответ, что ничего не найдено. Но слово "велосипед" в БД есть и даже при неправильном запросе, но близком к этому слову пользователь должен получить релевантный результат. Кроме того, необходимо учитывать разные словоформы одного слова. Подскажите готовые решения или пути. Спасибо.
artlayers вне форума Ответить с цитированием
Старый 10.08.2011, 11:52   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
...должен получить релевантный результат. Кроме того, необходимо учитывать разные словоформы одного слова. Подскажите готовые решения или пути.
Это задача уровня Яндекса или Гугла, а вы хотете одним запросом в "обычной" СУБД это сделать.
У вас судя по названию полей и БД то неправильно спроектирована, а тут такие задачи...
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 10.08.2011, 12:14   #3
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Как вариант - реализовать Autocomplete - через асинхронные запросы при вводе каждого символа.
Это дает достаточную релевантность - но вот "безграмотным" не поможет.
Andkorol вне форума Ответить с цитированием
Старый 10.08.2011, 12:48   #4
artlayers
 
Регистрация: 04.11.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от mv28jam Посмотреть сообщение
Это задача уровня Яндекса или Гугла, а вы хотете одним запросом в "обычной" СУБД это сделать.
У вас судя по названию полей и БД то неправильно спроектирована, а тут такие задачи...
Не хочу один запросом это сделать, разве что поиск матчем через фултекст поможет релевантности чем-то. Я ищу готовые решения, что-то типа sphinx. Запрос приведен в качестве примера, к реальной БД отношения не имеет.
Автокомплит есть с третьего символа.
artlayers вне форума Ответить с цитированием
Старый 10.08.2011, 16:52   #5
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Восклицание

Цитата:
Сообщение от mv28jam Посмотреть сообщение
Это задача уровня Яндекса или Гугла, а вы хотете одним запросом в "обычной" СУБД это сделать.
У вас судя по названию полей и БД то неправильно спроектирована, а тут такие задачи...
А чем вас FULLTEXT не устраивает?
dem66 вне форума Ответить с цитированием
Старый 11.08.2011, 10:07   #6
artlayers
 
Регистрация: 04.11.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от dem66 Посмотреть сообщение
А чем вас FULLTEXT не устраивает?
он не решает проблему опечаток и ошибок
artlayers вне форума Ответить с цитированием
Старый 11.08.2011, 12:30   #7
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
По умолчанию

эту проблему решает морфологическая библиотека. Все это в связке дает хороший поисковик, я использую его на своих сайтах. если надо выложу библиотеку
dem66 вне форума Ответить с цитированием
Старый 11.08.2011, 12:45   #8
artlayers
 
Регистрация: 04.11.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от dem66 Посмотреть сообщение
эту проблему решает морфологическая библиотека. Все это в связке дает хороший поисковик, я использую его на своих сайтах. если надо выложу библиотеку
Буду благодарен
artlayers вне форума Ответить с цитированием
Старый 05.10.2011, 19:03   #9
upsgan
Новичок
Джуниор
 
Регистрация: 05.10.2011
Сообщений: 2
По умолчанию

Здрасти всем!
Сколько перечитал, так и не получилось настроить работу поиска php MySQL с помощью морф. словаря!
И мне кажнтся многие парятся как и я в этом вопросе.
На сайтах много статей на эту тему, но увы, я лично не допёр!
Отсюда следует: Нужен поиск с помощью словря phpMorphy.
Т.е. база и скрипт уже заточенный под неё, в рабочем состоянии.
Кому не жалко , скиньте на форум в общий доступ! Я думаю многие будут благодарны...

Последний раз редактировалось upsgan; 05.10.2011 в 19:06.
upsgan вне форума Ответить с цитированием
Старый 05.10.2011, 21:28   #10
dem66
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 316
Радость

о нем я и говорил. вот пример реализации.
я так у себя на сайтах делаю

PHP код:
<?php

$str
="$_POST[name]";

if(
eregi("[a-zA-z0-9]"$str)){
$search="$str";
}else{
include(
"functions.php");
$search="$vivod";
}

$error ""
 if(empty(
$search))     

$error .=  "<p>Вы не указали данные для поиска.</p>"

else 


if (!
get_magic_quotes_gpc()) 

$name mysql_escape_string($search); 

else 

$name="$search"


$query "SELECT * FROM tovar WHERE MATCH (name, opis)  AGAINST ('$name' IN BOOLEAN MODE)"
$post mysql_query($query); 
if(
$post

$numtot mysql_num_rows($post); 
if(
$numtot>0


$rezult="";
while(
$posts mysql_fetch_array($post)) 

$rezult .=  "<tr>".$post['img']."</tr>";
}
$res="$numtot";
}

else 

$error .=  "<p>По запросу: $_POST[name] ничего не найдено!!!.</p>"

}
}


if(isset(
$error)) {
print 
$error
print 
$rezult;
}

?>

<b><?php echo"Найдено: $res"?> результатов</b>

Содержимое файла functions.php
PHP код:
<?php
$word_one 
strtoupper($str);
require_once(
'phpmorphy/src/common.php');

    
$opts = array(
        
'storage' => PHPMORPHY_STORAGE_MEM,
        
'with_gramtab' => false,
        
'predict_by_suffix' => true
        
'predict_by_db' => true
    
);
    
    
$dir 'phpmorphy/dicts';
    
    
$dict_bundle =  new phpMorphy_FilesBundle($dir'rus');
   
// $dict_bundle .=  new phpMorphy_FilesBundle($dir, 'eng');
    
    
$morphy = new phpMorphy($dict_bundle$opts);
        
try {
    
$bulk_words = array($word_one);
    
$base_form $morphy->getBaseForm($bulk_words);
    
$all_forms $morphy->getAllForms($bulk_words);
    
$pseudo_root $morphy->getPseudoRoot($bulk_words);

//    echo '<br><br>' . implode(', ', $all_forms[$word_one]) . "\n";
$vivod implode(', '$all_forms[$word_one]);
//echo"$vivod";

} catch(phpMorphy_Exception $e) {
    die(
'Error occured while text processing: ' $e->getMessage());
}
?>
Вобщем суть такая -> когда пришел английский текст то морфология не используется, если написали по русски то используем морфологию. при желании можно использовать и английскую морфологию. ВНИМАНИЕ МОЖЕТ БЫТЬ ОДНОВРЕМЕННО ПОДКЛЮЧЕН ТОЛЬКО ОДИН СЛОВАРЬ!!!

PHP код:
// Русский
$dict_bundle =  new phpMorphy_FilesBundle($dir'rus');

// или Английский
   // $dict_bundle .=  new phpMorphy_FilesBundle($dir, 'eng'); 
Удачи
Вложения
Тип файла: zip phpmorphy.zip (4.51 Мб, 25 просмотров)
dem66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движок для сайта webstream HTML и CSS 2 27.12.2010 17:37
Движок для сайта рассылок ТРОЯН=) WordPress и другие CMS 3 27.11.2010 08:36
Движок для сайта. artem1989 Помощь студентам 1 05.10.2009 20:25
Бесплатный движок для САЙТА на Java Script для Бесплатных Хостингов антигерой HTML и CSS 0 15.04.2007 21:39