Хорошо, это будет большой ответ.
Я думаю, что вам нужен генератор синтаксических анализаторов.Часть программного обеспечения, которая генерирует код для анализа текста в соответствии с заданной грамматикой.Эти парсеры часто имеют 2 основных компонента: лексер и парсер.Лексер определяет TOKENS (слова), анализатор проверяет правильность порядка токенов в соответствии с вашей грамматикой.
В лексере вы должны объявить следующие токены
TOKENS ::= (AND, OR, NOT, WORD, WORDSTAR, LPAREN, RPAREN, QUOTE)
WORD ::= '/w+/'
WORDSTAR ::= '/w+\*/'
Грамматика должнаопределяется следующим образом:
QUERY ::= word
QUERY ::= wordstar
QUERY ::= lparen QUERY rparen
QUERY ::= QUERY and QUERY
QUERY ::= QUERY or QUERY
QUERY ::= QUERY and not QUERY
QUERY ::= quote MQUERY quote
MQUERY ::= word MQUERY
MQUERY ::= word
Эта грамматика определяет язык со всеми необходимыми вам функциями.В зависимости от программного обеспечения, которое вы используете, вы можете определить функции для обработки каждого правила.Таким образом, вы можете преобразовать свой текстовый запрос в предложение sql where.
Я не очень разбираюсь в php, но я искал в интернете генератор парсера и появился PHP_ParserGenerator .
Имейте в виду, что по мере роста вашей базы данныхзапросы могут стать проблемой для структурированной системы хранения.
Возможно, вы захотите попробовать механизм полнотекстового поиска, который позволяет вам выполнять эту и многие другие функции, связанные с текстовым поиском.Вот как IndexTank работает
Сначала вы добавляете (или 'index' на поисковом диалекте) все свои записи базы данных (или документы) в IndexTank.
$api = new ApiClient(...);
$index = $api->get_index('my_index');
foreach ($dbRows as $row) {
$index->add_document($row->id, array('text' => $row->text));
}
После этого вы можете выполнять поиск по индексу по всем нужным операторам
$index = $api->get_index('my_index');
$search_result = $index->search('Apples AND Oranges');
$search_result = $index->search('Apples OR Oranges');
$search_result = $index->search('Apples AND NOT Oranges');
$search_result = $index->search('"apples oranges"');
$search_result = $index->search('Apples AND ( Oranges OR Pears )');
$search_result = $index->search('Appl*');
Надеюсь, я ответил на ваш вопрос.