MySQL: Fulltext & ORDER BY

Sergey_Al

Новичок
Делаю ORDER BY по релевантности и ещё нескольким полям.

SELECT *, MATCH(book_name) AGAINST('windows') as score
FROM `books` WHERE MATCH(book_name) AGAINST('windows')
ORDER BY score DESC, book_name
Объясните, что не так в запросе? Почему при добавлении book_name в ORDER BY все поля score становятся одинаковыми?

Эту проблему я обошёл вложенным запросом, но кажется, что чего-то я не понимаю.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
для полнотекстового поиска лучше использовать sphinx
 

Sergey_Al

Новичок
для полнотекстового поиска лучше использовать sphinx
Для него нужен vds/vps+ либо хостинг где можно его запустить. Пока меня устраивает только вариант с хостинггом, но я такой до 500 рублей не видел. Буду рад, если кто-то подскажет.

Не может быть!
Как проверял?
Сравнил выдачу двух запросов:

1. ORDER BY score DESC
2. ORDER BY score DESC, book_name

Сейчас у меня база чуть меньше, по 'windows' выдаёт мало результатов и всё ок. Но по более популярному слову 'жизнь' (~ 400 строк) все поля scrore абсолютно одинаковые.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Sergey_Al
любой лоукостер, например hetzner, позволит тебе за 11 евро поднять свой сервак с блекджеком и девочками.
 

Sergey_Al

Новичок
Sergey_Al
любой лоукостер, например hetzner, позволит тебе за 11 евро поднять свой сервак с блекджеком и девочками.
Пока для меня свой сервак не подходит, я не хочу заниматься вопросами администрирования. Да, это не дорого, но отнимет и будет отнимать кучу времени.
Sphinx в общем-то тоже сейчас лишняя трата времени, но вот хостинг с возможностью запускать процессы на длительное время нужен и подходящий я найти никак не могу =(
 

Redjik

Джедай-мастер
Sergey_Al
ты так и не ответил - КАК проверял - phpMyAdmin?
У меня сразу закралось подозрение, теперь оно только крепнет, сейчас ты напишешь, что проверял в phpMyAdmin - а я тебя, в свою очередь, отправлю почитать как mysql делает сортировку по нескольким полям.

ЗЫ. моя vds на облаке обходится мне 100-140 рублей в месяц - 2 сайта для тестов + показать заказчику на ней крутятся.
 

Redjik

Джедай-мастер
facepalm

я не знаю как тебе ЕЩЕ больше намекнуть.

Когда ты делаешь Order By по двум полям, сортировка идет по первому полю сначала, по второму же полю она идет в тех случаях когда значения первого поля совпадают.
Предположим ты отсортировал по релевантности 5000 записей, в самом верху будут записи одинаковой релевантности. Ты же по ней блин сортируешь в первую очередь.

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

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

Sergey_Al

Новичок
Мда, молодец, унизил так унизил, самое главное в гугле за меня поискал.

Как ты считаешь, а какой сортировки я ожидаю от mysql? Именно сначала по релевантности, а потом по второму полю отсортировать записи с одинаковой релевантностью.
А как ты думаешь, в чём проблема была изначально? В том, что когда я добавлял второе поле book_name, сортировка по релевантности просто не происходила и на первое! место попадали абсолютно нерелевантные записи.

И когда я пишу что ВСЕ поля score одинаковые, это означает именно все и ничего другого. Да, все 400 результатов поиска с одинаковым поле score, представь себе, причём на одной странице в phpMyAdmin, который умеет выводить все записи без страничной разбивки.
 

Sergey_Al

Новичок
И вообще, предположим я даже запустил запрос №1 - посмотрел первые 10 записей и разные score, запустил запрос №2 - увидел одинаковые score. Что меняется? А ничего. Листать дальше необязательно.
 

Redjik

Джедай-мастер
ORDER BY score DESC, book_name DESC
если даже это не поможет, то готов принести извинения, если заработает, то все актуально
 

Sergey_Al

Новичок
Не помогло. Все поля score почему-то одинаковые. И интересно, что если я меняю "ORDER BY score DESC, book_name" на "ORDER BY score DESC, id" - всё ок.

И ещё интересно, что сортировка всё-таки вроде как работает верно, точно я уже выяснять не буду, тут я мог ошибиться обратив внимание только на неверный score.
 

Redjik

Джедай-мастер
ты точно так написал - напиши полный запрос, с моей поправкой
 

Sergey_Al

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

Вообще изначально весь вопрос состоял только из "почему", а не "как". Redjik, скорее всего ты прав в том, что запрос работает верно. А я прав в том, что вижу странное поведение mysql в выдаче релевантности.

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

Sergey_Al

Новичок
Вот запросы, которые выдают разные score:

1.
SELECT *, MATCH(book_name) AGAINST('windows') as score
FROM `books` WHERE MATCH(book_name) AGAINST('windows')
ORDER BY score DESC, book_name
2.
SELECT *, MATCH(book_name) AGAINST('жизнь') as score
FROM `books` WHERE MATCH(book_name) AGAINST('жизнь')
ORDER BY score DESC, id LIMIT 1000

А вот запрос со странной выдачей (одинаковый score):
SELECT *, MATCH(book_name) AGAINST('жизнь') as score
FROM `books` WHERE MATCH(book_name) AGAINST('жизнь')
ORDER BY score DESC, book_name DESC LIMIT 1000

Теперь точно можно заканчивать =)
 
Сверху