релевантность
Модератор: terminus
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
релевантность
что нужно вносить в новую таблицу с индексами в FULLTEXT которую мы созданим? я искал нигле не нашел - гониво!
кто как делает? может новый возможности появились?
нашел статьи:
http://phpclub.ru/detail/article/mysql_search
http://www.opennet.ru/base/dev/mysql_pg ... h.txt.html
нужно сделать:
1) or
2) and
3) точное совпадение ' 'слово' ' между пробелами
сначало хочу узнать что в индексы заносить надо?
ЗЫ пока сделаю проще '%слово%'
кто как делает? может новый возможности появились?
нашел статьи:
http://phpclub.ru/detail/article/mysql_search
http://www.opennet.ru/base/dev/mysql_pg ... h.txt.html
нужно сделать:
1) or
2) and
3) точное совпадение ' 'слово' ' между пробелами
сначало хочу узнать что в индексы заносить надо?
ЗЫ пока сделаю проще '%слово%'
Услуги хостинговой компании Host-Food.ru
Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
что именно искал и что именно гониво?ProFTP писал(а):я искал нигле не нашел - гониво!
чего хочешь добиться?ProFTP писал(а):сначало хочу узнать что в индексы заносить надо?
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
там нужно создать таблицу для индексов, в нее надо что-то вставлять или нет?
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
ты какие индексы имеешь в виду? есть разные логические уровни. Ты создаёшь индекс на уровне приложения?ProFTP писал(а):там нужно создать таблицу для индексов, в нее надо что-то вставлять или нет?
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
тут написано http://phpclub.ru/detail/article/mysql_search что нужно создать таблицу с индексами, даже 2 таблицы, в них вставлять ничего не надо? в них само вставлятся будет или они пустые должны быть?
ЗЫ я спрашиваю как это правильно сделать, например в этом форуме поиск тоже фигово выдает результат... на дргом движке нормально, навреное там по другому или запрос для поиска лучше написан
ЗЫ я спрашиваю как это правильно сделать, например в этом форуме поиск тоже фигово выдает результат... на дргом движке нормально, навреное там по другому или запрос для поиска лучше написан
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
нам надо просто добавить к существующе талицы такой индекс FULLTEXT (title,body)
элепенты стобцов те столбцы по которым искать
элепенты стобцов те столбцы по которым искать
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
увы, не нашёл мануала на оф. сайте, но есть специальный хелп на эту тему. Лучше используй его, а не кривую статью
Код: Выделить всё
mysql> help AGAINST
Name: 'MATCH AGAINST'
Description:
Syntax:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
MySQL has support for full-text indexing and searching:
o A full-text index in MySQL is an index of type FULLTEXT.
o Full-text indexes can be used only with MyISAM tables, and can be
created only for CHAR, VARCHAR, or TEXT columns.
o A FULLTEXT index definition can be given in the CREATE TABLE
statement when a table is created, or added later using ALTER TABLE
or CREATE INDEX.
o For large data sets, it is much faster to load your data into a table
that has no FULLTEXT index and then create the index after that, than
to load data into a table that has an existing FULLTEXT index.
Full-text searching is performed using MATCH() ... AGAINST syntax.
MATCH() takes a comma-separated list that names the columns to be
searched. AGAINST takes a string to search for, and an optional
modifier that indicates what type of search to perform. The search
string must be a literal string, not a variable or a column name. There
are three types of full-text searches:
o A boolean search interprets the search string using the rules of a
special query language. The string contains the words to search for.
It can also contain operators that specify requirements such that a
word must be present or absent in matching rows, or that it should be
weighted higher or lower than usual. Common words such as "some" or
"then" are stopwords and do not match if present in the search
string. The IN BOOLEAN MODE modifier specifies a boolean search. For
more information, see
http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html.
o A natural language search interprets the search string as a phrase in
natural human language (a phrase in free text). There are no special
operators. The stopword list applies. In addition, words that are
present in 50% or more of the rows are considered common and do not
match. Full-text searches are natural language searches if the IN
NATURAL LANGUAGE MODE modifier is given or if no modifier is given.
o A query expansion search is a modification of a natural language
search. The search string is used to perform a natural language
search. Then words from the most relevant rows returned by the search
are added to the search string and the search is done again. The
query returns the rows from the second search. The IN NATURAL
LANGUAGE MODE WITH QUERY EXPANSION or WITH QUERY EXPANSION modifier
specifies a query expansion search. For more information, see
http://dev.mysql.com/doc/refman/5.1/en/fulltext-query-expansion.html.
The IN NATURAL LANGUAGE MODE and IN NATURAL LANGUAGE MODE WITH QUERY
EXPANSION modifiers were added in MySQL 5.1.7.
URL: http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
Examples:
mysql> SELECT id, body, MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root'
-> IN NATURAL LANGUAGE MODE) AS score
-> FROM articles WHERE MATCH (title,body) AGAINST
-> ('Security implications of running MySQL as root'
-> IN NATURAL LANGUAGE MODE);
+----+-------------------------------------+-----------------+
| id | body | score |
+----+-------------------------------------+-----------------+
| 4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
| 6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
mysql>
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
только там не написано как сделать отсортировать по релевантность по нескольких таблицм (нужно по 4)
и я не могу найти как выести вместе с ними название самой таблицы в которые был результат
есть такая штука только не пойму как пользоватся http://search.cpan.org/~tjmather/DBIx-F ... tSearch.pm
и я не могу найти как выести вместе с ними название самой таблицы в которые был результат
есть такая штука только не пойму как пользоватся http://search.cpan.org/~tjmather/DBIx-F ... tSearch.pm
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
ProFTP писал(а):и я не могу найти как выести вместе с ними название самой таблицы в которые был результат
Код: Выделить всё
mysql> select user, host, 'table1' from mysql.user
-> union
-> select user, host, 'table2' from mysql.user
-> ;
+------+-------------+--------+
| user | host | table1 |
+------+-------------+--------+
| root | 127.0.0.1 | table1 |
| | localhost | table1 |
| root | localhost | table1 |
| root | 127.0.0.1 | table2 |
| | localhost | table2 |
| root | localhost | table2 |
+------+-------------+--------+
6 rows in set (0.06 sec)
mysql>
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
а если вместе вывод отсортировать? никак?
отсортировать с релевантностью
отсортировать с релевантностью
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
там наверное есть решения како-йто, либо MySQL еще не доделан... в оф. документации такого нету...
если сразу изо всех таблицы это делать, то наверное ресурсы будет жрать
кстате, в чем разница между двумя индексами?
если сразу изо всех таблицы это делать, то наверное ресурсы будет жрать
кстате, в чем разница между двумя индексами?
Код: Выделить всё
ALTER TABLE mytable ADD FULLTEXT name (name, description);
Код: Выделить всё
ALTER TABLE mytable ADD FULLTEXT (name);
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
а трабла то в чём? сортируй, как тебе надоProFTP писал(а):отсортировать с релевантностью

Код: Выделить всё
zg# cat 1.sql | mysql -t
+---------------------+--------+
| relevant | table |
+---------------------+--------+
| 0.986553386772567 | table1 |
| 0.974475261731516 | table1 |
| 0.961940984206219 | table1 |
| 0.939486527759104 | table2 |
| 0.774889376736143 | table2 |
| 0.652830925446778 | table2 |
| 0.611743230011075 | table1 |
| 0.407205329655861 | table2 |
| 0.0870457674256021 | table2 |
| 0.00934117940193152 | table1 |
+---------------------+--------+
zg#
Код: Выделить всё
select * from
(
select rand() as 'relevant', 'table1' as 'table' from mysql.user
union
select rand(), 'table2' from mysql.user
) t1
order by t1.relevant desc;
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
в первом два поля индексируются, а во втором только первое.ProFTP писал(а):кстате, в чем разница между двумя индексами?
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
спасибо попробую, я думал тут есть один запрос, когда идет поиск, то СУБД смотрит сразу во всех таблицах
например, если идет поиск и есть в одной таблице я нашел много, но в другой нету что выводит, то прийдется все равно выводить.... ладно тут надо навренео как-то извратиться
а в чем разница тут, я имел ввиду: или без разницы?
например, если идет поиск и есть в одной таблице я нашел много, но в другой нету что выводит, то прийдется все равно выводить.... ладно тут надо навренео как-то извратиться
а в чем разница тут, я имел ввиду: или без разницы?
Код: Выделить всё
ALTER TABLE mytable ADD FULLTEXT (name, description);
Код: Выделить всё
ALTER TABLE mytable ADD FULLTEXT name (name, description);
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
ни в чём, в во втором случае имя индекса задано явно, а в первом имя индекса создастся автоматически из имени первого поля.ProFTP писал(а):а в чем разница тут
в таких запросах нет смысла, это ошибочная логика.ProFTP писал(а):то СУБД смотрит сразу во всех таблицах
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
я понял что это усложняется
но на некоторых сайтах я видел что идет поиск из нескольких таблиц, хотя возможно и нет, но можно было искать в коментариях и в сообщениях, например...
случай:
я ищу слово какоой-то или словосчетания (если без FULlTEXT то усложняется из словосчетания )
нужно вывести 10 элементов из-зо всех сразу которые совпадают (иначе смысл поиска )
есть таблица1 в которой искомое слово есть и много...
есть таблица2 в которой искомое слово есть одно!
тут надо как групировать, зачем выводит по ровну если лучше выести 1 значени из таблицы2 и 9 значений из таблицы1
то есть я хочу поиск сделать нормальный, странно что в гугле нету...
на этом форуме поиск что фиг что-то найдешь
но на некоторых сайтах я видел что идет поиск из нескольких таблиц, хотя возможно и нет, но можно было искать в коментариях и в сообщениях, например...
случай:
я ищу слово какоой-то или словосчетания (если без FULlTEXT то усложняется из словосчетания )
нужно вывести 10 элементов из-зо всех сразу которые совпадают (иначе смысл поиска )
есть таблица1 в которой искомое слово есть и много...
есть таблица2 в которой искомое слово есть одно!
тут надо как групировать, зачем выводит по ровну если лучше выести 1 значени из таблицы2 и 9 значений из таблицы1
то есть я хочу поиск сделать нормальный, странно что в гугле нету...
на этом форуме поиск что фиг что-то найдешь
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
кто выводит? где выводит? у меня выводит не поровну, а два раза из одной таблицы.ProFTP писал(а):тут надо как групировать, зачем выводит по ровну
дак и выводи, кто тебе запрещает то?ProFTP писал(а):нужно вывести 10 элементов из-зо всех сразу которые совпадают
тут ограничений особых нетProFTP писал(а):но на некоторых сайтах я видел что идет поиск из нескольких таблиц
но вообще, если таблиц несколько то лучше будет сделать несколько запросов, чем один общий.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
ok, сделаю в одной таблице
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
Код: Выделить всё
select (
select 'Найдено в таблице1',.. from table1 ...
union
select 'Найдено в таблице2',... from table2 ...
union
select 'Найдено в таблице3'... from table3 ..)
order by relevance;
А как узнать сколько результатов выдало? чтобы по странично потсроить, 2 одинаковых запроса выполнить чтоли?
что-то я не понимаю как это сделать
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
через временную таблицу, а не подзапросProFTP писал(а):что-то я не понимаю как это сделать
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: релевантность
попробуй сначала без временной таблицы, если не получится, то вводи времянку, а дальше по статье http://anton-pribora.ru/articles/php/php-pages-list/
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
я пока так сделал
Код: Выделить всё
При создании индексов FULLTEXT по нескольким полям возможны 2 варианта:
CREATE TABLE table
(
field1 VARCHAR (255),
field2 TEXT,
FULLTEXT (field1, field2)
)
CREATE TABLE table
(
field1 VARCHAR (255),
field2 TEXT,
FULLTEXT (field1),
FULLTEXT (field2)
)
В первом случае возможен запрос:
SELECT *, MATCH field1, field2 AGAINST ('$searchwords') as relev FROM table ORDER BY relev DESC
релевантность вычисляется у всех полей сразу. Во втором случае такой запрос выдаст ошибку. Здесь вычисляем релевантность следующим образом:
SELECT *, MATCH field1 AGAINST ('$searchwords')+MATCH field2 AGAINST ('$searchwords') as relev FROM table ORDER BY relev DESC
Второй вариант несколько сложнее в запросах, однако, на мой взгляд лучше, т.к. увеличивается гибкость поиска — к каждому из полей можно задать, например, коэффициент значимости и при суммировании релевантностей полей умножать их на этот коэффициент. Поисковая фраза будет "больше" искаться в полях с большим коэффициентом. Например, если мы делаем поиск по проиндексированным страницам каталога ресурсов, то поле имени страницы обычно задают с большим коэффициентом, чем поля мета-тегов описаний или ключевых слов.
- LMik
- капитан
- Сообщения: 1852
- Зарегистрирован: 2007-07-17 9:14:39
- Откуда: МО
- Контактная информация:
Re: релевантность
Это какой то веб проект или что? Просто если действительно хочется хороший поиск и чтобы быстро всё работало - mysql в innodb, а поисковый движкок sphinx.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!
Виpус детям не игpушка, не товаpищ и не дpуг!
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: релевантность
это для моего сайта http://lissyara.org.ua/photo/view/9/104LMik писал(а):Это какой то веб проект или что? Просто если действительно хочется хороший поиск и чтобы быстро всё работало - mysql в innodb, а поисковый движкок sphinx.
я вот видел http://search.cpan.org/~jjschutz/Sphinx ... /Search.pm
но нужно ставить дополнительную софтину http://www.sphinxsearch.com/ что не очень хочется... чтобы не зависить от него и там уже понаствлял Сишных программ всяких, мне нужен был красивый поиск, но не все возможный поиск, и нагрузки на сайт сейчас нету

http://habrahabr.ru/blogs/webdev/40218/
Последний раз редактировалось ProFTP 2009-12-15 8:20:30, всего редактировалось 1 раз.