За последние 24 часа нас посетили 16593 программиста и 1650 роботов. Сейчас ищут 1954 программиста ...

MATCH и AGAINST

Тема в разделе "MySQL", создана пользователем Azrarn, 14 июн 2008.

  1. Azrarn

    Azrarn Активный пользователь

    С нами с:
    14 июн 2008
    Сообщения:
    3
    Симпатии:
    0
    Здравствуйте.
    Появилась проблема - нужно искать в БД одинаковые записи, ну и помечать каким то образом. Пробовал различные способы. Самым удобным было использование similar_text() в php, оно же и самое медленное. По скорости устраивает использование MATCH\AGAINST, но не могу понять, как используя их определить степень похожести двух строк? Если similar_text() возвращает похожесть в процентах - 100% идентичные строки, то MATCH\AGAINST возвращает совершенно невнятные ответы. Единственное что там можно понять если сравнивать одну строку с несколькими то самую похожую, но на сколько они похожи - непонятно.
    Подскажите пожалуйста, как их правильно интерпретировать, что бы определить похожесть строк по какой то фиксированной шкале? Надеюсь это вообще в принципе возможно?
    Спасибо.
     
  2. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Матч возвращает массив отсортированный в порядке релевантности. Поиск осуществляется в полях с полностекстовым поиском. По желанию, можно тоже вернуть % релевантности.
    http://phpclub.ru/mysql/doc/fulltext-search.html
     
  3. Azrarn

    Azrarn Активный пользователь

    С нами с:
    14 июн 2008
    Сообщения:
    3
    Симпатии:
    0
    Извините, а как вернуть именно процент?
    В примере который в ссылке есть такое:
    +----+-------------------------------------+-----------------+
    | id | body | score |
    +----+-------------------------------------+-----------------+
    | 4 | 1. Never run mysqld as root. 2. ... | 1.5055546709332 |
    | 6 | When configured properly, MySQL ... | 1.31140957288 |
    +----+-------------------------------------+-----------------+
    Извиняюсь что таблица поехала.
    Так вот 1.5 и 1.3 это и есть процент? Не похоже что то. У меня и за несколько тысяч вроде зашкаливало, при сравнении больших строк. Или я что то путаю. Завтра еще раз проверю.
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Azrarn
    Да, да, вы правы насчет этого. Это не процент.
    Как получить % - не знаю, возможно по какой-то формуле. Для этого надо понаблюдать за результатами.
     
  5. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    А может лучше сначала мануал почитать?

    А вообще не понял в чем проблема?

    UPDATE bla, blabla SET bla.metka = 1 WHERE bla.stri = blabla.stri;
    Ну и ндекс в blabla и bla по stri должен быть.
     
  6. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Предложения по поводу перевода в %?
     
  7. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Залезть в исходники FULLTEXT INDEX и подкрутить как нада.
    Там всего кил 300 C'ишного кода. :D
     
  8. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
  9. Azrarn

    Azrarn Активный пользователь

    С нами с:
    14 июн 2008
    Сообщения:
    3
    Симпатии:
    0
    Sphinx я тоже использую, меня то сейчас интересует именно нахождение дублей, причем не 100% разумеется, это не сложно. Sphinx такое тоже не позволяет сделать, я на тамошнем форуме интересовался.

    Так значит никто не знает?
     
  10. EugeneTM

    EugeneTM Активный пользователь

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Если я правильно по буржуйски понял, то булевый режим тебе нужен. Частотные характеристики он игнорирует.
    http://www.sphinxsearch.com/doc.html#matching-modes

    или с SetFieldWeights играться
    http://www.sphinxsearch.com/doc.html#ap ... eldweights

    возможно и то и другое одновременно.

    Смотреть при каких установках будет выдавать нужный результат.
    The weights must be positive 32-bit integers. The final weight will be a 32-bit integer too. Default weight value is 1.