Поиск нескольких слов

$lider

Бывает
Помогите кто-то с
PHP:
preg_match
Может у меня что с форматом??
Может так яснее будет:

PHP:
$words = explode (" ",$sel); // массив строки запроса
$allwords = count($words);// сколько слов в запросе
for ($all = 0; $all < $allwords; $all++) // проходим по каждому из слов в запросе
{	
	if(preg_match("/(у|ы|а|о|я|е|и|ь)$/i", $words[$all])) $long = -1;
	if(preg_match("/(и|е|о|а|ы|у)[еямюйивх]$/i", $words[$all])) $long = -2;
	$short = substr($words[$all],0,$long);
	$korotko.=$short.' ';
};
 

Леша Темный

Guest
PHP:
$sel = preg_replace('/(и|е|о|а|ы|у)[еямюйивх](?=(\s|\Z))$/i', '', $sel);
$sel = preg_replace('/(у|ы|а|о|я|е|и|ь)(?=(\s|\Z))/i', '', $sel);

$words = split("[ \t\n\r]+", $sel);
-~{}~ 13.04.05 19:37:

Извиняюсь. Знак $ в перевом реге лишний
 

$lider

Бывает
Леша Темный
я сделал поиск по словам с ревалентностью (учет частоты втречаемости слова)...
Леша Темный не темни :)
Подскажи как релевантность устроил...

-~{}~ 14.04.05 08:52:

Автор оригинала: Леша Темный
PHP:
preg_replace
Ты думаешь резать исходную фразу хорошая идея??

Может лучше исходные слова оставлять нетронутыми, а заменять уже по ходу в другой переменной
 

Леша Темный

Guest
Ревалентность у меня устроена так:

Есть таблицы:

[sql]word (word_id int unique auto_incement, word varchar(20) primary key);[/sql]- таблица встречающихся слов.

[sql]match (match_word_id int, match_doc_id int, match_weight int,
key match_word_id (match_word_id),
key match_doc_id (match_doc_id)
)[/sql]; - таблица попаданий
match_weight - вес слова word_id в доке doc_id

Вес расчитывается так: weight = intval(10000 * word_count / total_count); (для больших статей коэфициент можно взять больше. 10000 - из расчета, что в статьях до 10000 значащих слов).

Далее поиск

[sql]select doc_id, match_weight from word, match where word_id = match_word_id and word = '$word'
-- order by match_weight desc;[/sql]

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

Из моего скрипта:

PHP:
$match_doc = array();
	while ( $f = mysql_fetch_assoc($r) )
	{
				$match_doc[$f['doc_id']] = array(
					'weight' => $match_doc[$f['doc_id']]['weight'] + $f['match_weight'],
					'doc_title' => $f['doc_title'],
					'doc_file' => $f['doc_file'],
					'dir_file' => $f['dir_file'],
					'doc_descr' => $f['doc_descr']
				);
	}
function search_cmp($doc1, $doc2)
{
	if ( $doc1['weight'] < $doc2['weight'] ) return 1;
	elseif ( $doc1['weight'] > $doc2['weight'] ) return -1;
	else return 0;
}

usort($match_doc, "search_cmp");
-~{}~ 14.04.05 13:45:

Забыл запрос показать:
PHP:
	$text = HtmlSpecialChars($_GET['text']);
	$words = "'".str_replace(' ', "','", clean_words($_GET['text']))."'";

	$r = mysql_query("select doc_id, match_weight, doc_title, doc_file, dir_file, doc_descr from $INFO[db_pref]match, $INFO[db_pref]word, $INFO[db_pref]docs, $INFO[db_pref]dirs where match_doc_id = doc_id and doc_dir_id = dir_id and match_word_id = word_id and word IN ($words)") or fatal_error(__LINE__.": ".__FILE__.": ".mysql_error());
 

$lider

Бывает
Ревалентность у меня устроена так:
Есть идея:
после получения
PHP:
$myrow=mysql_fetch_array($result)
пробегать по каждой строке массива $myrow[] и смотреть, если есть поисковое слово
PHP:
$count+1
Так по всем словам и по всем элементам массива. А потом выводить где максимальный $count ...

-~{}~ 15.04.05 15:18:

И еще:
надо бы базу сделать с предлогами (кто, где....), ведь все порежет :(

-~{}~ 18.04.05 16:19:

Автор оригинала: $lider
Есть идея:
после получения
PHP:
$myrow=mysql_fetch_array($result)
пробегать по каждой строке массива $myrow[] и смотреть, если есть поисковое слово
PHP:
$count+1
Так по всем словам и по всем элементам массива. А потом выводить где максимальный $count ...

-~{}~ 15.04.05 15:18:

И еще:
надо бы базу сделать с предлогами (кто, где....), ведь все порежет :(
Подсчет я сделал, да вот многомерный массив получился :(
Теперь вывод постраничный внапряг сделать :( ...
 
Сверху