2013-03-21 3 views
3

У меня есть база данных из 80 000 строк, и когда я тестировал некоторые запросы FULLTEXT, я столкнулся с неожиданным результатом. Я удалил из MYSQL стоп-слова и установить минимальную длину слова до 3.MYSQL fulltext - неожиданный результат

Когда я делаю этот запрос:

SELECT `sentence`, MATCH (`sentence`) AGAINST ('CAN YOU FLY') AS `relevance` 
FROM `sentences` 
WHERE MATCH (`sentence`) AGAINST ('CAN YOU FLY') 
ORDER BY `relevance` DESC 

Это дает этот результат:

NO A FLY WITHOUT WINGS WOULD BE CALLED A WINGLESS | 10.623517036438 
I CAN FLY           | 7.61278629302979 
I CAN FLY :)          | 7.61278629302979 
CAN YOU FLY?          | 7.61278629302979 
THEY CAN FLY          | 7.61278629302979 
YOU AM NOT FLY         | 7.61278629302979 
CAN YOU FLY          | 7.61278629302979 
HAVE YOU EVER SWALLOWED A FLY?     | 7.52720737457275 
I JUST WANNA FLY         | 7.52720737457275 

Почему «NO A ЛЕТАТЬ БЕЗ КРЫЛЬЯ БЫЛО ЗВОНОТЬ «БЕСПЛАТНО» получил самую высокую актуальность, он содержит только одно из слов ... Кроме того, как получилось «МОЖЕТЕ ЛИ ВЫ ЛЕТАТЬ» не наверху, это точное совпадение.

Я бы хотел, чтобы это было на заказ по наиболее подходящим ключевым словам, а затем заказывайте те, которые в порядке, а затем заказывайте наименьшее количество слов. Это дало бы логический результат:

CAN YOU FLY 
CAN YOU FLY? 
I CAN FLY 
THEY CAN FLY 
I CAN FLY :) 
YOU AM NOT FLY 
HAVE YOU EVER SWALLOWED A FLY? 
I JUST WANNA FLY 
NO A FLY WITHOUT WINGS WOULD BE CALLED A WINGLESS 

ответ

1

используется формула для расчетов доступна в MySQL Internals Manual:

w = (log(dtf)+1)/sumdtf * U/(1+0.0115*U) * log((N-nf)/nf) 

где

dtf  is the number of times the term appears in the document 
sumdtf is the sum of (log(dtf)+1)'s for all terms in the same document 
U  is the number of Unique terms in the document 
N  is the total number of documents 
nf  is the number of documents that contain the term 

Первый текст, очевидно, имеет больше контента чем другие. И эта формула сильно зависит от U, количества уникальных терминов в документе.

По вашему комментарию, я бы предложил использовать Boolean Fulltext Search:

SELECT `sentence`, MATCH (`sentence`) AGAINST ('CAN YOU FLY' IN BOOLEAN MODE) AS `relevance` 
FROM `sentences` 
WHERE MATCH (`sentence`) AGAINST ('CAN YOU FLY' IN BOOLEAN MODE) 
ORDER BY `relevance` DESC 
+0

Вау, они серьезно должны пересмотреть свою формулу, если даже не точная фраза находится в верхней части результатов ... – Lenton

+0

@ user1970772 Это полнотекстовый поиск, он не предназначен для 3-х словных документов. Например, 'FLY' присутствует во всех документах, поэтому он не имеет значения, он увеличивает значение' nf'. – Tchoupi

+0

Знаете ли вы какие-либо альтернативы FULLTEXT, которые дадут мне мой желаемый результат? – Lenton

Смежные вопросы