MATCH наоборот :)

botan

Новичок
MATCH наоборот :)

Вопрос по:
MATCH(`fields`) AGAINST (`values` IN BOOLEAN MODE)
Проблема следующая:
у меня в таблице стоят короткие слова
1. "США ОАЭ Нидерланды"
2. "США Англия Китай Нидерланды"
И есть запрос пользователя:
"ИЗ США через ОАЭ в Нидерланды плюс ещё куча разных ненужных слов которые ему взбрело в голову ввести"

Хотелось бы в 1 запрос вывести все поля, которые содержат каждое слово из пользовательского запроса.
(Т.е. на указаный запрос должно вывестись 1 пункт т.к. в запросе есть все 3 слова).
Раньше я юзал LOCATE но недавно прочитал об FULLTEXT хотелось бы узнать можно ли так.
Образно выражаясь:
MATCH(`values`) AGAINST (`fields` IN BOOLEAN MODE)
 

iliah

Новичок
"+" надо добавлять к каждому искомому слову

в мане вообще-то об этом написано
 

botan

Новичок
Прочитал ман до дыр уже :)
И всё это я знаю.
Проблема не в этом.
+ я должен добавить "к каждому слову хранящемуся у меня в таблице", а потом засунуть это по AGAINST.
Не знаешь как ? :)
 

iliah

Новичок
> + я должен добавить "к каждому слову хранящемуся у меня в таблице
???

а что мешает при формировании запроса добавить этот модификатор только к запрошенным словам

-~{}~ 21.07.04 20:10:

т.е пользователь ввел "США ОАЭ Нидерланды"
ты парсишь строку, формируешь запрос
$q = '+'.$a[0]. ... etc. //где $a - массив искомых слов
...AGAINST ('".$q."' ...
 

botan

Новичок
Вот смотри:
Чищу запрос, оставляю в запросе пользователя только только те слова которые есть в базе:
НАпример в результате имею
"ААА БББ ВВВ ГГГ ДДД"
Далее в таблице есть записи
`searchfield`
"ААА БББ"
"ААА ВВВ БББ"
"ААА ЕЕЕ ССС"
"ООО ААА БББ"
"ШГГ ЕСС ГГГ"
"ДДД ССС"
Результат должен дать
"ААА БББ"
"ААА ВВВ БББ".
 

iliah

Новичок
>оставляю только те слова которые есть в базе

> в результате имею "ААА БББ ВВВ ГГГ ДДД"

> в таблице есть записи
>"ААА БББ"
>"ААА ВВВ БББ"
>"ААА ЕЕЕ ССС"
>"ООО ААА БББ"

не сходится

-~{}~ 21.07.04 20:20:

т.е вроде бы как надо для ААА и БББ поставить "+"
а для всего остального не надо

тогда надо изначально определиться что надо, а что не надо искать, а этим
>оставляю только те слова которые есть в базе

ты делаешь непонятную для меня двойную работу

-~{}~ 21.07.04 20:25:

тебе на самом деле очень сильно поможет отключение BOOLEAN MODE,

к сожалению заказчики не всегда понимают, почему в разделе содержащем две статьи поиск по слову к-рое есть хотя бы в одной из них не ищет выдает ничего
тогда приходится BM включать

а без него можно считать релевантность ср-вами mysql и отсекать по 0.5 к примеру

imho это почти то, что тебе нужно
 

botan

Новичок
проблема в том, что мне надо в качестве аргумента AGAINST испльзовать поле, не а в качестве MATCH - строку. НЕ хочет гад :)
 

iliah

Новичок
>мне надо в качестве аргумента AGAINST испльзовать поле, не а в качестве MATCH - строку

наоборот, и менять не надо
 

botan

Новичок
Я знаю что наоборот :))
Просто не врублюсь. Если у меня в полях 2 слова, а в запрсе 10 то каким запросом узнать входят эти 2 в те 10.
Счас уже склонен к невероятным извращениям. Но пока сдерживаюсь :)
Ещё подумаю.
 

iliah

Новичок
>входят эти 2 в те 10
еще раз - наоборот

не эти два в те десять, а десять в два - конечно не входят

-~{}~ 21.07.04 20:49:

все же советую определиться - если ли необходимость включать BM или нет
если нет, то никаких проблем с поиском у тебя возникнуть не должно
 

botan

Новичок
Originally posted by botan
Вот смотри:
Чищу запрос, оставляю в запросе пользователя только только те слова которые есть в базе:
НАпример в результате имею
"ААА БББ ВВВ ГГГ ДДД"
Далее в таблице есть записи
`searchfield`
"ААА БББ"
"ААА ВВВ БББ"
"ААА ЕЕЕ ССС"
"ООО ААА БББ"
"ШГГ ЕСС ГГГ"
"ДДД ССС"
Результат должен дать
"ААА БББ"
"ААА ВВВ БББ".
Если откажусь от BM как думаешь результат такой будет ?
Ну понятно что не всегда на сколько часто будут "ненужности" вылазить?
 

iliah

Новичок
а вообще может в твоем случае не нужно использовать MATCH
раз уж у тебя
>в таблице стоят короткие слова

в phpbb к примеру отдельная таблица проиндексированных слов, посмотри как там реализован поиск

-~{}~ 21.07.04 20:57:

я не знаю твоей мотивации именно такого проектирования базы, какие связи между "словами" в, к примеру, "ООО ААА БББ"

если записей пять и трех есть ААА - нет
 

botan

Новичок
Это и будут как раз те самые невероятные извращения...
 

iliah

Новичок
все же не нравятся мне такие поля,
у тебя насколько я могу судить - граф и тебе надо найти связанные вершины

если это хоть примерно похоже на правду. реализация базы должна быть совсем другой

-~{}~ 21.07.04 21:02:

/me жалеет, что не доучился на матфаке :(
 

botan

Новичок
Ну например так (поднаготная слишком долгая).
Если проводить аналогию.
Вы пишите все продукты что есть у вас в холодильнике.
Есть рецепт, и в отдельном поле "ингридиенты" хранится то что надо что бы его приготовить. Надо по введенным продуктам выдать рецепты того, что из них можно приготовить.

-~{}~ 21.07.04 21:09:

А в идеале, если ничего нельзя, выдавать:
"Вот были бы МАКАРОНЫ.... , тогда вы могли бы сделать такое-то..."
Но зная как сделать первое, это совсем не сложно :)
 

iliah

Новичок
первое-то делается строгим добавлением "+" к каждому слову, и чем больше "рецептур", тем удовлетворительней поиск
 

botan

Новичок
Ладно про 2-е забыли, так с дуру ляпнул :)
Как ты хочешь добавить "+" к каждому полю? Средствами пхп ? И ведь опять получается что парметром MATCH() должен быть запрос пользователя а параметром AGAINST - поле :(
 

iliah

Новичок
пример из мануала :

mysql> SELECT * FROM articles WHERE MATCH (title,body)
-> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

параметр MATCH() - поля
параметр AGAINST() - строка слов

-~{}~ 21.07.04 21:24:

+ добавляется не к полю а к каждому слову

-~{}~ 21.07.04 21:27:

так, погонял запросы и возникло важное уточнение :
запрос находит поля содержащие три слова, даже если в самом запросе четыре слова и все с плюсом

-~{}~ 21.07.04 21:33:

на пяти словах с обязательным плюсом поиск накрылся :)
тогда может сделать так - ниболее значимые слова вводятся как правило первыми => подобрать оптимальное соотношение слов (исходя из их количества, а кроме того средней длины полей), к которым будет добавляться "+" и следом слова из строки поиска, к которым он не применяется
 

botan

Новичок
И что бы на одном языке говорили :
CREATE TABLE `test` (
`id` int(11) NOT NULL auto_increment,
`search` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `search` (`search`)
) TYPE=MyISAM AUTO_INCREMENT=7 ;

#
# Дамп данных таблицы `test`
#

INSERT INTO `test` VALUES (1, 'ААА БББ');
INSERT INTO `test` VALUES (2, 'ААА ВВВ БББ');
INSERT INTO `test` VALUES (3, 'ААА ЕЕЕ ССС');
INSERT INTO `test` VALUES (4, 'ООО ААА БББ');
INSERT INTO `test` VALUES (5, 'ШГГ ЕСС ГГГ');
INSERT INTO `test` VALUES (6, 'ДДД ССС');

SELECT * ,MATCH
(`search`) AGAINST ('+ААА +БББ +ВВВ +ГГГ +ДДД' IN BOOLEAN MODE) from `test` WHERE 1

Или я тебя не правильно понял ?

-~{}~ 21.07.04 21:39:

Originally posted by iliah
тогда может сделать так - ниболее значимые слова вводятся как правило первыми
Исходя из того что я вижу перед глазами - железно нет :)
Скорее наоборот :)

-~{}~ 21.07.04 21:42:

1| ААА БББ |0
2| ААА ВВВ БББ| 1.555764036159
3| ААА ЕЕЕ ССС| 0
4| ООО ААА БББ| 0
5| ШГГ ЕСС ГГГ| 1.555764036159
6| ДДД ССС| 1.573253125842
Это без BOOLEAN MODE
Вообще не вариант, сам видишь :)
 

iliah

Новичок
а если так ?
SELECT * FROM `test` WHERE MATCH
(`search`) AGAINST ('+ААА +БББ +ВВВ +ГГГ +ДДД' IN BOOLEAN MODE)

-~{}~ 21.07.04 21:44:

результат - 0

-~{}~ 21.07.04 21:48:

так стоп, не ищет он трехбуквенные слова
 
Сверху