SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 21.10.2011 13:41:50

Error-free
Участник
Зарегистрирован: 21.10.2011
Сообщений: 2

Полнотекстовый поиск mysql

Есть запрос:

SELECT DISTINCT href,
            id,
            field_name, field_data,
            site_id, search_group_id, topic,
            (relevance + sub_relevance*(MATCH (field_data) AGAINST ('+30d-11-14'  IN BOOLEAN MODE)) )        as rel,
            (relevance + sub_relevance*(MATCH (field_data) AGAINST ('+30d-11-14'  IN BOOLEAN MODE)) )    as rel1,
            (relevance + sub_relevance*(MATCH (field_data) AGAINST ('+'  IN BOOLEAN MODE)) )    as rel2
        FROM
            engio_search_index
        WHERE
            ( MATCH(field_data) AGAINST ('+30d-11-14' IN BOOLEAN MODE)
            OR MATCH(field_data) AGAINST ('+30d-11-14' IN BOOLEAN MODE)
            OR MATCH(field_data) AGAINST ('+30d-11-14*' IN BOOLEAN MODE ))
        AND
            (search_group_id = 1)

               

               
         GROUP BY
            href
         ORDER BY
            MATCH (field_data) AGAINST ('30d-11-14') DESC, rel, rel1, rel2, href DESC
                LIMIT 40



По нему ничего не находится.
Есть второй запрос:


SELECT DISTINCT href,
            id,
            field_name, field_data,
            site_id, search_group_id, topic,
            (relevance + sub_relevance*(MATCH (field_data) AGAINST ('+30d-11-14 ml333r'  IN BOOLEAN MODE)) )        as rel,
            (relevance + sub_relevance*(MATCH (field_data) AGAINST ('+30d-11-14'  IN BOOLEAN MODE)) )    as rel1,
            (relevance + sub_relevance*(MATCH (field_data) AGAINST ('+ml333r'  IN BOOLEAN MODE)) )    as rel2
        FROM
            engio_search_index
        WHERE
            ( MATCH(field_data) AGAINST ('+30d-11-14 ml333r' IN BOOLEAN MODE)
            OR MATCH(field_data) AGAINST ('+30d-11-14' IN BOOLEAN MODE)
            OR MATCH(field_data) AGAINST ('+30d-11-14*' IN BOOLEAN MODE )
            OR MATCH(field_data) AGAINST ('+ml333r' IN BOOLEAN MODE)
            OR MATCH(field_data) AGAINST ('+ml333r*' IN BOOLEAN MODE ))
        AND
            (search_group_id = 1)

               

               
         GROUP BY
            href
         ORDER BY
            MATCH (field_data) AGAINST ('30d-11-14 ml333r') DESC, rel, rel1, rel2, href DESC
                LIMIT 40




Разница в том, что во втором запросе в  WHERE добавлено условие:

           
OR MATCH(field_data) AGAINST ('+ml333r' IN BOOLEAN MODE)
            OR MATCH(field_data) AGAINST ('+ml333r*' IN BOOLEAN MODE )


И изменено

('+30d-11-14' IN BOOLEAN MODE)


на

('+30d-11-14 ml333r' IN BOOLEAN MODE)



Первый запрос не находит ничего. Второй находит.

Вот данные которые находит второй запрос:

Генератор FDJ/ML333R

Результат запроса во вложении.


Теперь вопрос: почему?

Отредактированно Error-free (21.10.2011 13:42:55)


Прикрепленные файлы:
Attachment Icon zapros.jpg, Размер: 329,189 байт, Скачано: 630

Неактивен

 

#2 23.10.2011 20:34:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Полнотекстовый поиск mysql

А символ «-» у Вас входит в список букв? Если нет, то 30d-11-14 — это три слова
длины менее 4 (а потому не учитывающихся в индексе). В результате MySQL ищет
только по единственному слову из запроса — ml333r.

Неактивен

 

Board footer

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