SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.06.2014 00:27:35

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

проблема с full text search (релевантность)

столькнулся с проблемой что при использовании full text search y всех записей одинаковый скор если искать слово php или Maçã

подскажите что я  делаю не так?


Copyright (c) 2009-2014 Percona LLC and/or its affiliates
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version        5.6.17-66.0-log
Protocol version    10
Connection        Localhost via UNIX socket
UNIX socket        /var/run/mysqld/mysqld.sock
Uptime:            2 days 5 hours 22 min 30 sec





mysql> select version();
+-----------------+
| version()       |
+-----------------+
| 5.6.17-66.0-log |
+-----------------+
1 row in set (0.00 sec)


CREATE TABLE IF NOT EXISTS `opinions` (
  `Opinion` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  FULLTEXT KEY `Opinion` (`Opinion`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `opinions` (`Opinion`) VALUES
('MySQL is a very fast database'),
('Green is everyone''s favourite colour'),
('Databases are helpful for storing data'),
('PHP is a very nice language'),
('Spain is a nice country to visit'),
('Perl isn''t as nice a language as PHP'),
('This is a blank row to avoid the 50% rule'),
('Quinoa e Linhaça Mamão e Maçã'),
('Maçã');

mysql> SELECT Opinion, MATCH(Opinion) AGAINST('nice language' IN BOOLEAN MODE) AS Score FROM opinions WHERE MATCH(Opinion) AGAINST ('nice language' IN BOOLEAN MODE);
+--------------------------------------+---------------------+
| Opinion                              | Score               |
+--------------------------------------+---------------------+
| PHP is a very nice language          |  0.6543312668800354 |
| Perl isn't as nice a language as PHP |  0.6543312668800354 |
| Spain is a nice country to visit     | 0.22764469683170319 |
+--------------------------------------+---------------------+
3 rows in set (0.00 sec)


mysql> SELECT Opinion, MATCH(Opinion) AGAINST('
php' IN BOOLEAN MODE) AS Score FROM opinions WHERE MATCH(Opinion) AGAINST ('php' IN BOOLEAN MODE);
+--------------------------------------+--------------------+
| Opinion                              | Score              |
+--------------------------------------+--------------------+
| PHP is a very nice language          | 0.4266865849494934 |
| Perl isn'
t as nice a language as PHP | 0.4266865849494934 |
+--------------------------------------+--------------------+
2 rows in set (0.00 sec)

mysql> SELECT Opinion, MATCH(Opinion) AGAINST('maçã' IN BOOLEAN MODE) AS Score FROM opinions WHERE MATCH(Opinion) AGAINST ('maçã' IN BOOLEAN MODE);
+-----------------------------------+--------------------+
| Opinion                           | Score              |
+-----------------------------------+--------------------+
| Quinoa e Linhaça Mamão e Maçã     | 0.4266865849494934 |
| Maçã                              | 0.4266865849494934 |
+-----------------------------------+--------------------+
2 rows in set (0.00 sec)

 

Неактивен

 

#2 22.06.2014 05:06:25

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: проблема с full text search (релевантность)

Score зависит от того, сколько раз встречаются слова из запроса. В вашем случае они употребляются одинаковое число раз, поэтому закономерно совпадение.

INSERT INTO `opinions` (`Opinion`) VALUES ('MySQL is a very nice database and php is a nice language');
mysql> SELECT Opinion, MATCH(Opinion) AGAINST('nice language') AS Score FROM opinions WHERE MATCH(Opinion) AGAINST ('nice language' IN BOOLEAN MODE);
+----------------------------------------------------------+-----------------------+
| Opinion                                                  | Score                 |
+----------------------------------------------------------+-----------------------+
| MySQL is a very nice database and php is a nice language |   0.02818211354315281 |
| PHP is a very nice language                              |   0.02608836442232132 |
| Perl isn't as nice a language as PHP                     |   0.02608836442232132 |
| Spain is a nice country to visit                         | 0.0020937479566782713 |
+----------------------------------------------------------+-----------------------+
4 rows in set (0.01 sec)

Неактивен

 

#3 22.06.2014 19:44:23

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

Re: проблема с full text search (релевантность)

Вы хотите сказать что этот запрос одинако релевантвый для результата поиска?

как мне кажется на первом месте должен быть результат состощий из одного слова Maçã а у же не втором Quinoa e Linhaça Mamão e Maçã

это как то можно делать чтобы результаты были максимально приближены к реальности поиска а не просто подсчета того  сколько раз встречается это слово?

ведь место положения слова в строке тоже влияет на релеванстность


mysql> SELECT Opinion, MATCH(Opinion) AGAINST('maçã' IN BOOLEAN MODE) AS Score FROM opinions WHERE MATCH(Opinion) AGAINST ('maçã' IN BOOLEAN MODE);
+-----------------------------------+--------------------+
| Opinion                           | Score              |
+-----------------------------------+--------------------+
| Quinoa e Linhaça Mamão e Maçã     | 0.4266865849494934 |
| Maçã                              | 0.4266865849494934 |
+-----------------------------------+--------------------+
2 rows in set (0.00 sec)
 


rgbeast написал:

Score зависит от того, сколько раз встречаются слова из запроса. В вашем случае они употребляются одинаковое число раз, поэтому закономерно совпадение.

INSERT INTO `opinions` (`Opinion`) VALUES ('MySQL is a very nice database and php is a nice language');
mysql> SELECT Opinion, MATCH(Opinion) AGAINST('nice language') AS Score FROM opinions WHERE MATCH(Opinion) AGAINST ('nice language' IN BOOLEAN MODE);
+----------------------------------------------------------+-----------------------+
| Opinion                                                  | Score                 |
+----------------------------------------------------------+-----------------------+
| MySQL is a very nice database and php is a nice language |   0.02818211354315281 |
| PHP is a very nice language                              |   0.02608836442232132 |
| Perl isn't as nice a language as PHP                     |   0.02608836442232132 |
| Spain is a nice country to visit                         | 0.0020937479566782713 |
+----------------------------------------------------------+-----------------------+
4 rows in set (0.01 sec)

Отредактированно maxjoin (22.06.2014 19:46:42)

Неактивен

 

#4 22.06.2014 23:09:50

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: проблема с full text search (релевантность)

Таков алгоритм FULLTEXT. Если требуется что-то ближе к реальному поиску документа, попробуйте Sphinx
http://sphinxsearch.com/blog/2010/08/17 … ing-works/

Неактивен

 

#5 23.06.2014 03:27:48

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

Re: проблема с full text search (релевантность)

тогда уже проще использовать elasticsearch

просто хотелось реализовать поиск на уровне самой мускл не прибегать к дополнительному программному обеспечению

rgbeast написал:

Таков алгоритм FULLTEXT. Если требуется что-то ближе к реальному поиску документа, попробуйте Sphinx
http://sphinxsearch.com/blog/2010/08/17 … ing-works/

Неактивен

 

#6 23.06.2014 05:41:50

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: проблема с full text search (релевантность)

Официальная документация рекомендует править исходники MySQL
http://dev.mysql.com/doc/refman/5.6/en/ … uning.html

Например, предлагается модификация файла storage/myisam/ftdefs.h:

#define GWS_IN_USE GWS_PROB

Change that line to this:
#define GWS_IN_USE GWS_FREQ


Я не делал, если что-то получится на этом пути, напишите.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson