[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите реализовать поиск по БД
Snus
Допустим, имеем таблицу test, в ней 2 столбца
val1 VARCHAR(10),
val2 VARCHAR(100)

В ней следующие данные
1234 Тест1
12345 Тест2
123456 Тест3


и имеем значение 1234567890, по которому нужно найти наиболее полное вхождение. В нашем случае это 123456 Тест3.
Какие у вас соображения есть?



Спустя 1 час, 4 минуты, 49 секунд (21.02.2011 - 14:55) Zerstoren написал(а):
Достать данные можно через регулярку. (Отправить команду на поиск по регулярке)

А релевантность уже обрабатывать в пхп коде.

сначала пробить на точные вхождения.
Если они есть, то дать ему высший уровень релевантности, далее в цикле пробивать
содержимое на substr_count
И снова-же, присваивать им некие балы для релевантности.

Но это только теория, по логике - это воплотимо, но очень тяжелый алгоритм получится.

Спустя 6 минут, 50 секунд (21.02.2011 - 15:02) Snus написал(а):
Zerstoren
Вот я тоже сижу голову ломаю. В таблице БД у меня 600 строк. Данных для поиска может быть до 200. Я так и планировал, искать по первым 4 цифрам, забивать в массив, а дальше искать большее вхождение пхп-скриптом. У меня это уже реализовано, но мне бы как-нибудь менее ресурсоемко придумать smile.gif Господа эксперты, направьте на путь истинный! smile.gif

Спустя 1 час, 5 минут, 14 секунд (21.02.2011 - 16:07) Snus написал(а):
Тема все еще актуальна smile.gif у кого-нибудь есть варианты реализации? smile.gif

Спустя 4 часа, 33 минуты, 48 секунд (21.02.2011 - 20:41) Renden написал(а):
Snus
Эм, я может что-то не допонимаю, но в Mysql есть же поиск по релевантности MATCH () AGAINST ()
Ну и если допустим надо несколько стобцов обьединить в 1 можно воспользоватся CONCAT()..

Спустя 2 часа, 4 минуты, 19 секунд (21.02.2011 - 22:45) Snus написал(а):
Renden
Спасибо, конечно, но этот вариант мне совсем не подходит smile.gif

Спустя 10 часов, 35 минут, 37 секунд (22.02.2011 - 09:21) linker написал(а):
А можно узнать конкретное применение этой задачи?

Спустя 15 минут, 15 секунд (22.02.2011 - 09:36) Snus написал(а):
linker
Можно. Я даже более того скажу, что возможно я туплю по-черному. У меня это бывает. Я начинаю разрывать мозг, думая, что задача не из самых легкий, а оказывается все может обойтись одной простой фун-ей.. Ну это я уже от темы ушел.
Так вот. По задаче:

Есть таблица. В ней есть коды от 4 до 10 знаков и описания.
Пример:

Array
(
[0] => Array
(
[codeX] => 8501
[codeY] =>
[info] => Марка (модель, артикул); тип (например, постоянного, переменного тока, синхронный и т.п.); количество фаз; мощность (Вт); для асинхронных двигателей - высота оси вращения (мм); количество (шт). (технические параметры изделий необходимо контролировать согласно техническому паспорту фирмы - изготовителя, инструкции (руководства) по эксплуатации или аналогичной технической документации, оригинала рекламного каталога и т.п.).
)

)


Мне нужно найти из всех записей наиболее полное вхождение (сравнение) с искомым кодом.
То есть. Я ввожу 8501402009 и он мне должен выдать то, что выше уже написал, если была бы еще запись с кодом 85014, то выдал бы ее - так как число вхождений больше. И код более соответствует искомому.
Надеюсь, понятно? :)

Спустя 1 минута, 59 секунд (22.02.2011 - 09:38) linker написал(а):
А почему ты вводишь 8501402009? 402009 - это что-то значит или просто так?

Спустя 2 минуты, 13 секунд (22.02.2011 - 09:40) Snus написал(а):
linker
8501402009 - это полный код. 8501 - это группа кодов. То есть для всех кодов, начинающихся на 8501 применимо это доп. описание.

Спустя 48 минут, 47 секунд (22.02.2011 - 10:29) Snus написал(а):
Задача немого упростилась. Не нужно наибольших вхождений. Достаточно первого вхождения. По новым данным (сообщили только что) группы уникальны. Не может быть 1234, а затем 12345. Может быть либо-либо.
Решил задачу таким способом. Если есть варианты посолиднее - предлагайте.

	foreach($codes as &$codeZ){
echo '<p>'.$codeZ.'<br>';
foreach($arr as &$val){
if(substr($codeZ, 0, strlen($val['codeX'])) == $val['codeX']){
$codeY = explode(',', $val['codeY']);
echo $val['codeX'];
if(!in_array($codeZ, $codeY)) echo ' +';
else echo ' -';
break;
}
}

echo '</p>';
}


array arr:
Array
(
[0] => Array
(
[codeX] => 8501
[codeY] =>
[info] => Марка (модель, артикул) ....
)

[1] => Array
(
[codeX] => 8508
[codeY] =>
[info] => Наименование товара ....
)

[2] => Array
(
[codeX] => 9006
[codeY] => 9006910000, 9006990000
[info] => - Уникальные идентификационные номера (серийный заводской номер)
)
)


array codes:
Array
(
[0] => 8501402009
[1] => 8508700001
[2] => 9006910000
[3] => 9006610000
[4] => 9006990000
)


На выходе:
8501402009
8501 +

8508700001
8508 +

9006910000
9006 -

9006610000
9006 +

9006990000
9006 -


Смысл в том, что codeX - код или группа кодов, в codeY - исключения для этой группы (если это группа).

Вдруг у кого такая же задача будет стоять, то возможно понадобится идея.

Вместо echo ' +'; у меня обработчик стоит. (на тот случай, чтобы не спрашивали, что с этим всем делать)
Всем спасибо! :)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.