Поиск слов, совпадения (точные, похожие)

Grapefruit Lips

Новичок
Поиск слов, совпадения (точные, похожие)

Я уже запутался с решением ((

NUM KEYS
61 | почему не завтра дождь идет
51 | почему сегодня дождь идет
44 | почему сегодня
40 | почему сегодня
24 | почему это
23 | почему
3 | почему


Как при запросе "Почему это сегодня идет дождь" (все слова в массив или циклом)
Получить все "NUM" , где "KEYS" наиболее подходят по смыслу запроса, т.е где наибольшая часть слов совпадает со словами в "KEYS"

Слов в запросе, и в "KEYS" может быть сколько угодно, по этому-то вот такая незадача ( ..

А далее, если не нашёл первого (более точного совпадения) по убывающей, например:

"Почему сегодня снег?" - получаем все "NUM" где "KEYS" = "почему сегодня"
"Почему картошка?" - получаем все "NUM" где "KEYS" = "почему"
и т.д..
 

Grapefruit Lips

Новичок
вещь конечно очень хорошая, пригодится
но... например:
сначало я ищу точное совпадение (запрос идентичный *keys*) WHERE keys = '".$zapros."'
если не нашёл, то получается, что ищем совпадение, где слова стоят в разнобой (-что надо, но ВСЕ слова), ПЛЮС, выводим всё, где просто есть слова запроса (что не совсем надо):
PHP:
$zapros=explode(" ",$zapros);
$parsa= "+".join(" +", $zapros);

$now="SELECT * FROM table WHERE MATCH (keys) AGAINST('".$parsa."' IN BOOLEAN MODE)";
При запросе: "почему дождь";
скрипт выведет всё, где есть слова "почему" и "дождь"

хотя таких условий написанно специально ДВА: *почему не завтра дождь..* и *почему сегодня дождь...*
т.е при запросе "почему дождь" - надо получить все NUM , где KEYS = "почему" , а при запросе "почему дождь идет сегодня" - все, где KEYS = "почему сегодня дождь идет"
в этом трудность(

Вот если запрос - "почему поклпоклпоклопк" - то скрипт ничего не выведет... Хотя надо вывести всё, где в KEYS только слово *почему* , если других слов (точных совпадений) не найдено..
 

vGhost

Новичок
Скорее всего одно из слов ("почему") либо попало в STOP WORDS LIST либо было определено базой при индексации как "плохое" слово по этому когда ты делаеш запрос

SELECT * FROM table WHERE MATCH (keys) AGAINST('+почему +дождь' IN BOOLEAN MODE)

На самом деле база делает поиск только по слову "дождь", а слово "почему" игнорирует. По этому во втором случае( "почему поклпоклпоклопк" ) не чего не найдено ибо первое слово проигнорировано а второе не найдено.

Приглядись внимательно утебя при выполнении
SELECT * FROM table WHERE MATCH (keys) AGAINST('+почему +дождь' IN BOOLEAN MODE)
Не будет не одного результата где нет слова "дождь"
 

Grapefruit Lips

Новичок
vGhost, да, потому что там стоит "+" а это значит, он ищет всё, где есть ОБА слова... т.е на самом деле, при любом слове , которого нет в базе , с тем словом, которое есть - ничего не выводит =((

т.е. AGAINST('+сегодня +траляляля' IN BOOLEAN MODE) ничего не выведет... потому что слова *траляляля* - нету в базе....

но как же быть?????

надо, чтобы при запросе AGAINST('+почему +траляляля +и +ещё +чтото' IN BOOLEAN MODE) - ("почему тряляляля и ещё что то") скрипт вывел всё, где KEYS = "почему" - т.к. он не нашёл точных совпадений, т.е. всех слов , что в условии , в KEYS . А при запросе "почему сегодня и ещё чтото" скрипт вывел всё, где KEYS = "почему сегодня" - потому что опять же - *и ещё чтото* - это ненайденные слова в условии....

как этого добится - я не знаю...

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

ЗАПРОС ================== ||| ПОЛУЧАЕМ KEYS
"почему дождь сегодня идет"=== ||| "почему сегодня дождь идет" - точное
"почему это дождь в китае идет" ||| "почему это" - не точное
"почему китай" ============= ||| "почему" - не точное
"почему" ================== ||| "почему" - точное

-~{}~ 29.03.06 01:54:

я бы всё решил бы проще, для каждого слова делал бы своё поле, и сравнивал бы сначало ВСЕ (and ... and) а потом по убывающей... всё бы было точно.... НО слов , и в запросе и в KEYS может быть сколько угодно.. в этом вся проблема... может как-нибудь всё таки можно это решить?
 

vGhost

Новичок
vGhost, да, потому что там стоит "+" а это значит, он ищет всё, где есть ОБА слова... т.е на самом деле, при любом слове , которого нет в базе , с тем словом, которое есть - ничего не выводит =((

т.е. AGAINST('+сегодня +траляляля' IN BOOLEAN MODE) ничего не выведет... потому что слова *траляляля* - нету в базе....
Правильно я не пому тогда в чём проблема? Если ты хочеш чтоб этот запрос вывел строки в которых хотябы одно слово совпало из двух юзай так
AGAINST('сегодня траляляля' IN BOOLEAN MODE)
Если траляляля в базе нет то выведет строки в которых есть сегодня

И ещё раз повторяю ты плюсы хоть ставь хоть нет если слово в стоп листе оно игнорируется в любом случае хоть ты 100 плюсов выставь
Например вот эти запросы:
AGAINST('+known +technology' IN BOOLEAN MODE)
AGAINST('+technology' IN BOOLEAN MODE)
будут АБСОЛЮТНО идентичны!


надо, чтобы при запросе AGAINST('+почему +траляляля +и +ещё +чтото' IN BOOLEAN MODE) - ("почему тряляляля и ещё что то") скрипт вывел всё, где KEYS = "почему" - т.к. он не нашёл точных совпадений, т.е. всех слов , что в условии , в KEYS . А при запросе "почему сегодня и ещё чтото" скрипт вывел всё, где KEYS = "почему сегодня" - потому что опять же - *и ещё чтото* - это ненайденные слова в условии....
Я чесно говоря до сих под до конца не понимаю твоей проблемы но если всётаки я правильно понял что ты хочеш то тебе надо убрать плюсы

SELECT * FROM table WHERE MATCH (keys) AGAINST('почему траляляля и ещё чтото' IN BOOLEAN MODE)
Вот как это должно звучать, в этом случае он выведет строки там где будет любое из слов. Выведет через (!). Нжеле ты хочеш чтоб отсортировал по релевантности то делай так

SELECT * FROM table WHERE MATCH (keys) AGAINST('почему траляляля и ещё чтото')

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

Grapefruit Lips

Новичок
Это всё понятно. Я наверное всё-таки забыл дописать, подчеркнуть, что главное, чтобы всё выводилось так, как я описал в !ПРИМЕРАХ!

vGhost, вот смотри, ты понимаешь, что есть условие ТОЧНО ДЛЯ всех СЛОВ - *почему сегодня идет дождь* - при запросе "почему блин этот дождь идет сегодня" или "почему этот дождь блин идет сегодня" - мы должны получить именно ЕГО... неважно в каком порядке стоят слова (в этом тоже проблема)

в том варианте ( AGAINST('почему траляляля и ещё чтото') ) - МЫ ПОЛУЧИМ ВСЁ где есть слово почему........... но нам то надо другое.... Нам не надо получать условие *ПОЧЕМУ СЕГОДНЯ ИДЕТ ДОЖДЬ* только потому, что там есть одно слово почему.... ведь в нём специально ЧЕТЫРЕ слова, т.е. совпадение для всех четырёх слов.....


запрос - ПОЧЕМУ НЕТУВОТЭТОГОСЛОВА - получаем всё, где KEYS = "почему" - (ТОЛЬКО со словом (ОДНИМ) - *почему*, потому что нету условия со словами *почему нетувотэтогослова* )
запрос - ПОЧЕМУ ВОТЭТОГОСЛОВАНЕТУ СЕГОДНЯ - получаем всё, где KEYS = "почему сегодня" (только с двумя словами - *почему* и *сегодня* ....... - потому что нету условия со словами *почему сегодня вотэтогослованету*)

вот об этом я говорю, может как то ещё можно это сделать?

-~{}~ 30.03.06 10:00:

Я как-то на половину сделал , голова распухла ((
Может кто подскажет плиз, как сделать вторую? =)

Проверяем, есть ли слова из запроса в базе, и если есть записываем их в массив $okwords
PHP:
$okwords=array();
foreach($clear_unique_words as $clo) {
   $nan=mysql_num_rows(mysql_query("SELECT * FROM table WHERE MATCH (keys) AGAINST('{$clo}' IN BOOLEAN MODE)"));  
   if($nan>0) {
      if(!in_array($clo,$okwords)) {
      $okwords[]=$clo;
      }
   } 
}

В базе попробывал держать слова (в KEYS) в массиве (serialize)
Дальше выводим все подходящие KEYS, т.е где есть ВСЕ слова из массива $okwords
PHP:
$bm=mysql_query("SELECT * FROM table");  
while($sm=mysql_fetch_array($bm)) {
  $mam=unserialize($sm['keys']);
//функция  [b]array_values_in_array($array1,$array2)[/b]  проверяет, совпадает ли $array1 и $array2
if(array_values_in_array($okwords, $mam) && count($okwords)==count($mam)){
   echo  join(" ",unserialize($sm['keys'])). "<br />";  // таким образом получаем все совпавшие KEYS
}
}
Теперь о главном, например, у нас есть KEYS вида:
Код:
 солцне светит ярко
 солцне светит
 солнце встает
 солнце
Вроде бы всё нормально, и при запросах, допустим:
Код:
 Сегодня ярко светит солнце           - получаем keys -        солцне светит ярко
 Как светит солнце                    - получаем keys -        солцне светит
 И вообще что такое солнце            - получаем keys -        солцне
и т.д. Всё бы замечательно, но, если запрос будет
Код:
Солнце встает а потом светит
То мы ничего не получаем, а надо нам получить ДВА KEYS - *солнце встает* и *солнце светит*

Подскажите , как это можно сделать? ((

-~{}~ 30.03.06 10:36:

забыл дописать, надо нам получить ДВА KEYS - *солнце встает* и *солнце светит* НО при этом не получить просто key - *солнце*
 
Сверху