ФорумПрограммированиеPHP для идиотов → Mysql Fulltext Search

Mysql Fulltext Search

  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 25 мая 2011 г. 20:33

    Привет дружочки!

    есть такая проблема у меня.
    имеется некая таблица с некоторыми данными
    CREATE TABLE `catalogsearch_fulltext` (
    `fulltext_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity ID',
    `product_id` int(10) unsigned NOT NULL COMMENT 'Product ID',
    `store_id` smallint(5) unsigned NOT NULL COMMENT 'Store ID',
    `data_index` longtext COMMENT 'Data index',
    PRIMARY KEY (`fulltext_id`),
    UNIQUE KEY `UNQ_CATALOGSEARCH_FULLTEXT_PRODUCT_ID_STORE_ID` (`product_id`,`store_id`),
    FULLTEXT KEY `FTI_CATALOGSEARCH_FULLTEXT_DATA_INDEX` (`data_index`)
    ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8


    допустип в одной из записей этой таблицы, в поле data_index имеется следующий текст
    SP-590-CR|Enabled|ololo|ololololololo|ololololol|500|1


    суть вот в чем, я пытаюсь сделать запрос
    SELECT *, MATCH (data_index) AGAINST ("SP-590-CR" IN BOOLEAN MODE) AS `relevance` FROM `catalogsearch_fulltext`


    и мне говорит что relevance = 0
    ахуеть =)
    я порылся, выяснилось что символ "-" работает как "стопворд", т.е. обрамляй его в кавычки не обрамляй - похуй. в итоге эта поеботина разбивает строку (SP-590-CR) на 3 части, а параметр ft_min_word_len в свою очередь отсекает эти маленькие словечки.

    вот у меня к вам вопрос, ктото с таким сталкивался ?
    или есть ли у когото идеи как это можно решить ?

    Спасибо
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 25 мая 2011 г. 20:50, спустя 16 минут 51 секунду

    SP-590-CR|Enabled|ololo|ololololololo|ololololol|500|1

    формат записи всегда такой? искаемый ключ всегда вначале?
    Сапожник без сапог
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 25 мая 2011 г. 21:04, спустя 14 минут 26 секунд


    SP-590-CR|Enabled|ololo|ololololololo|ololololol|500|1

    формат записи всегда такой? искаемый ключ всегда вначале?
    формат ты имеешь ввиду, то что фразы через пайп записаны ??
    искомый ключ может быть где угодно.
  • technobulka

    Сообщения: 4540 Репутация: N Группа: Джедаи

    Spritz 25 мая 2011 г. 21:07, спустя 2 минуты 11 секунд

    то что фразы через пайп записаны

    я теперь знаю, как это называеццо оО
    Высокоуровневое абстрактное говно
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 25 мая 2011 г. 21:35, спустя 28 минут 14 секунд

    искомый ключ может быть где угодно.

    если бы вначале можно было бы простым лайком обойтись :-)
    Сапожник без сапог
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 25 мая 2011 г. 23:01, спустя 1 час 26 минут 35 секунд

    Эскейпить не получается? \-
    Либо, REPLACE юзать
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 25 мая 2011 г. 23:10, спустя 8 минут 20 секунд

    Либо, REPLACE юзать

    наверное от полнотекстового индекса тогда не будет смысла)))
    Сапожник без сапог
  • AlexanderC

    Сообщения: 270 Репутация: N Группа: Кто попало

    Spritz 25 мая 2011 г. 23:33, спустя 23 минуты 31 секунду


    А в сторону REGEXP не пробовали копать ? REGEXP '[[:<:]]SP-590-CR[[:>:]]'
    Спустя 112 сек.
    ищет полное совпадение слова ( под словом подразумеваю alnum и '_', вот точно не помну входит ли туда '-' )
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 25 мая 2011 г. 23:38, спустя 5 минут 3 секунды

    AlexanderC, а зачем полнотекстовый индекс не задумывались? :)
    Сапожник без сапог
  • creeonix

    Сообщения: 19 Репутация: N Группа: Кто попало

    Spritz 26 мая 2011 г. 0:41, спустя 1 час 3 минуты 2 секунды

    Даешь сфинкс, в mysql полнотекстового поиска нет и никогда не будет.
    Спустя 211 сек.
    Да, и нельзя забывать про ограничение в 1000 символов
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 26 мая 2011 г. 0:50, спустя 8 минут 58 секунд

    эскейпить не выходит.
    вариант с регекспами не катит.
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 26 мая 2011 г. 0:55, спустя 4 минуты 24 секунды

    эскейпить не выходит.

    так и не выйдет если ты говоришь про стоп слова … стоп слова юзаются на этапе построения индекса, надо как то это стоп слово убрать из списка стоп слов

    например так …

    If you want to change the set of characters that are considered word characters, you can do so in several ways, as described in the following list. After making the modification, you must rebuild the indexes for each table that contains any FULLTEXT indexes. Suppose that you want to treat the hyphen character ('-') as a word character. Use one of these methods:

    Modify the MySQL source: In storage/myisam/ftdefs.h, see the true_word_char() and misc_word_char() macros. Add '-' to one of those macros and recompile MySQL.

    Modify a character set file: This requires no recompilation. The true_word_char() macro uses a “character type” table to distinguish letters and numbers from other characters. . You can edit the contents of the <ctype><map> array in one of the character set XML files to specify that '-' is a “letter.” Then use the given character set for your FULLTEXT indexes. For information about the <ctype><map> array format, see Section 9.3.1, “Character Definition Arrays”.

    Add a new collation for the character set used by the indexed columns, and alter the columns to use that collation. For general information about adding collations, see Section 9.4, “Adding a Collation to a Character Set”. For an example specific to full-text indexing, see Section 11.9.7, “Adding a Collation for Full-Text Indexing”.



    http://dev.mysql.com/doc/refman/5.5/en/fulltext-fine-tuning.html

    но по хорошему - надо как-то разделитель этот(-) поменять (но это видимо номенклатурный идентификатор какой то, не так просто будет поменять ..) и ребилднуть индекс.

    тебе тут по-моему придется либо делать тру eav либо like '%..%', к слову - регулярки медленнее лайка работают, лайт показывает совершенно неплохие результаты на больших таблицах, но надо понимать что %.% будет full scan ..
    Сапожник без сапог
  • NRG

    Сообщения: 4761 Репутация: N Группа: в ухо

    Spritz 26 мая 2011 г. 1:01, спустя 6 минут 32 секунды

    Modify the MySQL source: In storage/myisam/ftdefs.h, see the true_word_char() and misc_word_char() macros. Add '-' to one of those macros and recompile MySQL.

    phpdude, ты ебанулся ??))))) перекомпилить мускл ???))))
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 26 мая 2011 г. 1:04, спустя 2 минуты 42 секунды

    NRG, тру лохи! в вас бы фрибсд! xDDD

    а чо страшного? перекомпилил да и все :-)
    Спустя 39 сек.
    ну да, это не "стандартное" решение, поэтому я тебе предложил другие пути, менее травмоопасные ))))))))
    Сапожник без сапог
  • creeonix

    Сообщения: 19 Репутация: N Группа: Кто попало

    Spritz 26 мая 2011 г. 1:13, спустя 9 минут 9 секунд

    Если серьезно, я бы посмотрел на стоимость перехода на postgresql (tsearch2) или установки sphinx/solr

Пожалуйста, авторизуйтесь, чтобы написать комментарий!