2010-09-22 3 views
3

Мне нужно использовать полнотекстовый поиск, но таблицы, которые я использую в своем веб-приложении, используют механизм INNODB, из того, что я читаю JDBC, не поддерживает триггеры Mysql, и я должен развернуть проект на сервере курса, поэтому установка таких инструментов, как sphinxs, невозможна, может кто-нибудь предложить метод для полнотекстового поиска?Полный текстовый поиск с таблицами InnoDB

благодаря

Edit: требование в проекте должна иметь последовательную базу данных, таблица, на которой я хочу, чтобы выполнить поиск содержит перечень документов, которые существуют в лаборатории, для которых я строю веб-приложение , можно вставить в него новые инструменты, но предположим, что обращений к вставкам мало и что в основном таблица будет использоваться для доступа на чтение, в этом случае оправдывает MyIsam и будет соответствовать требованиям согласованности (Myisam не поддерживает транзакции)?

ответ

3

Вы можете создать вторую таблицу с использованием MyISAM, которая содержит только первичный ключ основной таблицы и текстовый контент, который вы хотите найти FULLTEXT. Затем, когда вы хотите выполнить полнотекстовый поиск, вы делаете JOIN между соответствующей таблицей InnoDB и таблицей MyISAM поисковой приманки с условием MATCH против таблицы MyISAM.

Это также позволяет хранить различный текст поисковой строки в таблице MyISAM в «реальном» тексте в таблице InnoDB, что позволяет реализовать такие функции, как остановка или специальная обработка апострофа/дефиса, которые MySQL FULLTEXT не может управлять.

Проблема здесь заключается в том, что данные MyISAM совместимы с данными InnoDB. Вы можете запускать задание так часто, чтобы сделать это, или сделать приложение записывать в обе таблицы в любое время, когда есть текстовое обновление. В любом случае, надеюсь, вы сможете избежать несогласованности в полнотекстовом поиске, где это было бы неприемлемо для «канонических» табличных данных.

Другой подход заключается в том, чтобы вернуться обратно к LIKE/RLIKE (regexp), если полнотекстовое решение, которое вы хотите, недоступно. Будет непроницаемым, поэтому не быстро, но, по крайней мере, он всегда будет работать, и это нормально для небольших баз данных.

Edit:

стол, на котором я хочу, чтобы выполнить поиск содержит перечень документов, которые существуют в лаборатории, для которых я строю веб-приложение

ОК, делает это на самом деле должны быть FULLTEXT подлежит поиску? Разве не лучше было бы моделировать такой список, как один объект для каждого типа оборудования, и таблицу соединений между лабораториями и оборудованием (или что бы это ни было)?

, так что если в то же время происходит 2 вставок?

MyISAM не позволит двум INSERT претендовать на тот же первичный ключ. Но этого недостаточно, чтобы гарантировать «согласованность» в общем случае. Хотя это звучит так, будто вы могли бы избежать этого с практической точки зрения, если есть явное требование «согласованности», это, вероятно, именно то, что они не хотят делать.

+0

Да, они предположили, что мы используем поиск FULLTEXT, потому что у каждого инструмента есть также поле описания, и это то, где нам нужно выполнить поиск. – Noona

+0

Я думаю, что я последую этому предложению: «Вы можете создать вторую таблицу с помощью MyISAM, которая содержит только первичный ключ основной таблицы и текстовый контент, который вы хотите найти в FULLTEXT. Затем, когда вы хотите выполнять поиск по полному тексту, вы делаете JOIN между соответствующей таблицей InnoDB и таблицей MyISAM поисковой приманки с условием MATCH против таблицы MyISAM. " – Noona

+0

Я думаю, что это не большая проблема, если я вернул тип для инструмента, которого нет в лаборатории, так как это то, что мы должны возвращать в поисковом выражении. – Noona

Смежные вопросы