Как узнать, есть ли данные слова в поисковой фразе?

tend

Новичок
Как узнать, есть ли данные слова в поисковой фразе?

Привет!

Есть разные наборы слов:
1. яблоко, банан, апельсин, ... - фрукты
2. помидоры, огурцы, капуста, ... - овощи
...
При поиске надо сделать так, чтобы поисковая фраза проверялась на наличие любого слова из всех наборов.
И если хоть какое-то имеется, тогда выводить название набора.
Например, если ищут "как приготовить помидоры?", надо чтобы выводилось "овощи".

Сразу пришло в голову сделать вот так, но может есть вариант более оптимальный?

PHP:
<?php

$s = "как готовить помидоры?";

$words = array(
	"овощи" => array(помидоры, огурцы, капуста),
	"фрукты" => array(яблоко, банан, апельсин)
);

foreach ($words as $id => $word)
{
	foreach ($words[$id] as $v)
	{
		if ( strpos($s,$v) !== false )
		echo $id;
	}
}

?>
 

Wicked

Новичок
strpos - это последнее, что мне пришло бы в голову :)

Если задача состоит только в поиске слов, предлагаю сделать так:
1) Делаешь массив
$words["помидоры"] => "овощи";
$words["огурцы"] => "овощи";
Он нам понадобится для скорости.
2) Разбиваешь $s на отдельные слова. Например, регулярным выражением. Заносим это в $s_arr, напимер.
3) идешь в цикле по словам из $s_arr (foreach($s_arr as $slovo)) и каждое из них проверяешь с помощью: if(isset[$words[$slovo]]) {echo $words[$slovo] }

Вроде все :)
 

tend

Новичок
Я просто так сделал еще на тот случай, если будут искать "как готовить помидорчики?", а в набор слов вставить корень слова - "помидор", чтобы находило в измененных падежах и словоформах. А в твоем случае не найдет.
Твой вариант намного лучше по скорости?
Я проверил на скорость свой вариант - весь процесс проходит не более, чем за 0.0005 секунд, поэтому я думаю оставить его.
 

das6745

Новичок
tend, почитай вот это, мне по крайней мере помогло в плане оптимизации.
http://phplens.com/benchmark_suite/index.php
http://www.php.lt/benchmark/phpbench.php

+, как и сказал Wicked, strpos - вроде как сдесь самое то

если нужно находить по маске то тут наверно регулярные выражения.
я так понимаю поиск будет вестись по ключевым словам по какомуто полю в базе?
Я проверил на скорость свой вариант
и как ты проверил?а если я задам строку из n слов, где n может быть от 0 до бесконечности?
 

Wicked

Новичок
tend
strpos - это также и последнее средство, о котором я бы подумал, если бы мне нужно было сделать учет морфологии :)

Что мешает включить в массив $words все словоформы для интересующих тебя слов?
 

tend

Новичок
я так понимаю поиск будет вестись по ключевым словам по какомуто полю в базе?
нет, нужно узнать, есть ли в поисковой фразе определенные слова, которых совсем немного.
и как ты проверил?а если я задам строку из n слов, где n может быть от 0 до бесконечности?
а поисковая фраза тоже имеет ограничение :)

Что мешает включить в массив $words все словоформы для интересующих тебя слов?
Блин, еще думать придется и над возможными словоформами. :)
А вообще ничего не мешает, но вот чувство какое-то... что-то не то.
 

das6745

Новичок
а поисковая фраза тоже имеет ограничение
и где это видно?

tend
определенные слова, которых совсем немного
Wicked
Что мешает включить в массив $words все словоформы
ему это ненадо, достаточно только корень слова или что ему надо.
strpos - это также и последнее средство
strpos - это также и единственно правильное средство в данном случае, на сколько я понимаю
 

Maler

Новичок
можно реализовать с применение Стеммер Портера (http://symmetrica.net/stemmer), но в идеале нужно иметь массив всех склонений, падежей.
 
Сверху