Замена релевантной сортировки для полнотекста MySQL в таблицах InnoDB? - PullRequest
2 голосов
/ 30 марта 2010

Я использую MySQL InnoDB и хочу выполнить полнотекстовый поиск в определенных столбцах. Каков наилучший способ сортировки результатов по релевантности?

Я пытаюсь сделать что-то вроде:

SELECT columns,   
(LENGTH(column_name) - LENGTH(REPLACE(column_name, '%searchterm%', ''))) AS score
FROM table
WHERE column_name LIKE '%searchterm%'
ORDER BY score

Однако это станет довольно сложным, когда я начну искать более 1 столбца или использовать более одного ключевого слова. У меня уже есть несколько объединений, поэтому я упростил приведенный выше запрос.

Кто-нибудь может предложить лучший способ? Я не хочу использовать стороннее программное обеспечение, такое как Sphinx и т. Д.

Ответы [ 3 ]

3 голосов
/ 31 марта 2010

Если вы не хотите использовать другой движок, вы можете создать «теневую» копию MyISAM вашей таблицы InnoDB и выполнить полнотекстовый поиск по этому. С некоторыми подходящими триггерами в таблице InnoDB вы можете относительно легко обновить копию MyISAM. И чтобы избежать вероятности исчезновения записи на стороне InnoDB, выполните объединение с таблицей InnoDB. Что-то вроде:

SELECT MATCH(myisamtable.field1, myisamtable.field2, myisamtable.field3)
        AGAINST ('search terms') AS relevance,
    mysitamtable.field1, myisamtable.field2, myisamtable.field3
FROM myistamtable
RIGHT JOIN innodbtable ON myistamtable.commonID = innodbtable.commonID
WHERE (innodbtable.commonID IS NOT NULL) AND (MATCH(myisamtable.field1, myisamtable.field2, myisamtable.field3) AGAINST ('search terms') IN BOOLEAN MODE)
ORDER BY relevance DESC;
1 голос
/ 11 апреля 2012

В MySQL 5.6 (в настоящее время в бета-версии, по состоянию на апрель 2012 г.) индексы FULLTEXT разрешены для таблиц InnoDB, поэтому вы можете использовать знакомый синтаксис поиска MyISAM с транзакциями InnoDB, объединениями, внешними ключами и т. Д. Дополнительные ссылки см. В разделе этот связанный вопрос StackOverflow .

1 голос
/ 30 марта 2010

Я бы посмотрел на Сфинкса или Солра. Оба имеют лучшие fts, чем MyISAM, и могут также работать с innoDB-таблицами.

...