релевантность

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

релевантность

Непрочитанное сообщение ProFTP » 2009-01-01 18:42:10

что нужно вносить в новую таблицу с индексами в FULLTEXT которую мы созданим? я искал нигле не нашел - гониво!

кто как делает? может новый возможности появились?

нашел статьи:
http://phpclub.ru/detail/article/mysql_search
http://www.opennet.ru/base/dev/mysql_pg ... h.txt.html

нужно сделать:
1) or
2) and
3) точное совпадение ' 'слово' ' между пробелами

сначало хочу узнать что в индексы заносить надо?

ЗЫ пока сделаю проще '%слово%'
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.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/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-01-02 9:57:36

ProFTP писал(а):я искал нигле не нашел - гониво!
что именно искал и что именно гониво?
ProFTP писал(а):сначало хочу узнать что в индексы заносить надо?
чего хочешь добиться?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-01-02 10:09:05

там нужно создать таблицу для индексов, в нее надо что-то вставлять или нет?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-01-02 10:20:07

ProFTP писал(а):там нужно создать таблицу для индексов, в нее надо что-то вставлять или нет?
ты какие индексы имеешь в виду? есть разные логические уровни. Ты создаёшь индекс на уровне приложения?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-01-02 10:43:38

тут написано http://phpclub.ru/detail/article/mysql_search что нужно создать таблицу с индексами, даже 2 таблицы, в них вставлять ничего не надо? в них само вставлятся будет или они пустые должны быть?

ЗЫ я спрашиваю как это правильно сделать, например в этом форуме поиск тоже фигово выдает результат... на дргом движке нормально, навреное там по другому или запрос для поиска лучше написан
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-01-02 11:12:16

нам надо просто добавить к существующе талицы такой индекс FULLTEXT (title,body)
элепенты стобцов те столбцы по которым искать
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-01-02 11:44:33

увы, не нашёл мануала на оф. сайте, но есть специальный хелп на эту тему. Лучше используй его, а не кривую статью

Код: Выделить всё

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: релевантность

Непрочитанное сообщение ProFTP » 2009-05-30 7:36:37

только там не написано как сделать отсортировать по релевантность по нескольких таблицм (нужно по 4)

и я не могу найти как выести вместе с ними название самой таблицы в которые был результат

есть такая штука только не пойму как пользоватся http://search.cpan.org/~tjmather/DBIx-F ... tSearch.pm
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-05-30 8:16:06

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 » 2009-05-30 8:35:03

а если вместе вывод отсортировать? никак?

отсортировать с релевантностью
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-05-30 8:40:13

там наверное есть решения како-йто, либо MySQL еще не доделан... в оф. документации такого нету...
если сразу изо всех таблицы это делать, то наверное ресурсы будет жрать

кстате, в чем разница между двумя индексами?

Код: Выделить всё

ALTER TABLE mytable ADD FULLTEXT name (name, description);

Код: Выделить всё

ALTER TABLE mytable ADD FULLTEXT (name);
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-05-30 8:45:15

ProFTP писал(а):отсортировать с релевантностью
а трабла то в чём? сортируй, как тебе надо :pardon:

Код: Выделить всё

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;

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-05-30 8:47:20

ProFTP писал(а):кстате, в чем разница между двумя индексами?
в первом два поля индексируются, а во втором только первое.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-05-30 8:58:29

спасибо попробую, я думал тут есть один запрос, когда идет поиск, то СУБД смотрит сразу во всех таблицах

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

а в чем разница тут, я имел ввиду: или без разницы?

Код: Выделить всё

    ALTER TABLE mytable ADD FULLTEXT (name, description);

Код: Выделить всё

    ALTER TABLE mytable ADD FULLTEXT name (name, description);
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-05-30 9:02:02

ProFTP писал(а):а в чем разница тут
ни в чём, в во втором случае имя индекса задано явно, а в первом имя индекса создастся автоматически из имени первого поля.
ProFTP писал(а):то СУБД смотрит сразу во всех таблицах
в таких запросах нет смысла, это ошибочная логика.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-05-30 9:10:18

я понял что это усложняется

но на некоторых сайтах я видел что идет поиск из нескольких таблиц, хотя возможно и нет, но можно было искать в коментариях и в сообщениях, например...

случай:
я ищу слово какоой-то или словосчетания (если без FULlTEXT то усложняется из словосчетания )
нужно вывести 10 элементов из-зо всех сразу которые совпадают (иначе смысл поиска )

есть таблица1 в которой искомое слово есть и много...
есть таблица2 в которой искомое слово есть одно!

тут надо как групировать, зачем выводит по ровну если лучше выести 1 значени из таблицы2 и 9 значений из таблицы1

то есть я хочу поиск сделать нормальный, странно что в гугле нету...

на этом форуме поиск что фиг что-то найдешь
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-05-30 9:15:42

ProFTP писал(а):тут надо как групировать, зачем выводит по ровну
кто выводит? где выводит? у меня выводит не поровну, а два раза из одной таблицы.
ProFTP писал(а):нужно вывести 10 элементов из-зо всех сразу которые совпадают
дак и выводи, кто тебе запрещает то?
ProFTP писал(а):но на некоторых сайтах я видел что идет поиск из нескольких таблиц
тут ограничений особых нет

но вообще, если таблиц несколько то лучше будет сделать несколько запросов, чем один общий.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-05-30 23:22:09

ok, сделаю в одной таблице
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-06-18 3:00:44

Код: Выделить всё

select ( 
 select 'Найдено в таблице1',.. from table1  ... 
  union 
 select 'Найдено в таблице2',... from table2 ... 
   union 
 select 'Найдено в таблице3'... from table3 ..) 
order by relevance;
======================================

А как узнать сколько результатов выдало? чтобы по странично потсроить, 2 одинаковых запроса выполнить чтоли?

что-то я не понимаю как это сделать
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-06-18 5:17:12

ProFTP писал(а):что-то я не понимаю как это сделать
через временную таблицу, а не подзапрос

Гость
проходил мимо

Re: релевантность

Непрочитанное сообщение Гость » 2009-06-18 5:25:12

каким образом?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: релевантность

Непрочитанное сообщение zg » 2009-06-18 5:57:25

попробуй сначала без временной таблицы, если не получится, то вводи времянку, а дальше по статье http://anton-pribora.ru/articles/php/php-pages-list/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-12-04 2:36:16

я пока так сделал

Код: Выделить всё

При создании индексов 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

Второй вариант несколько сложнее в запросах, однако, на мой взгляд лучше, т.к. увеличивается гибкость поиска — к каждому из полей можно задать, например, коэффициент значимости и при суммировании релевантностей полей умножать их на этот коэффициент. Поисковая фраза будет "больше" искаться в полях с большим коэффициентом. Например, если мы делаем поиск по проиндексированным страницам каталога ресурсов, то поле имени страницы обычно задают с большим коэффициентом, чем поля мета-тегов описаний или ключевых слов. 
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: релевантность

Непрочитанное сообщение LMik » 2009-12-04 9:44:34

Это какой то веб проект или что? Просто если действительно хочется хороший поиск и чтобы быстро всё работало - mysql в innodb, а поисковый движкок sphinx.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: релевантность

Непрочитанное сообщение ProFTP » 2009-12-04 12:19:22

LMik писал(а):Это какой то веб проект или что? Просто если действительно хочется хороший поиск и чтобы быстро всё работало - mysql в innodb, а поисковый движкок sphinx.
это для моего сайта http://lissyara.org.ua/photo/view/9/104

я вот видел 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 раз.
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение