Ok, to będzie duża odpowiedź.
Myślę, że potrzebny jest generator parsera. Fragment oprogramowania generującego kod do parsowania tekstu zgodnie z gramatyką. Te parsery często mają 2 główne komponenty: lexer i parser. Lexer identyfikuje TOKENS (słowa), parser sprawdza czy kolejność tokenów jest zgodna z twoją gramatyką.
W lexer, należy zadeklarować następujące znaki
TOKENS ::= (AND, OR, NOT, WORD, WORDSTAR, LPAREN, RPAREN, QUOTE)
WORD ::= '/w+/'
WORDSTAR ::= '/w+\*/'
Gramatyka powinny być zdefiniowane tak:
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
Ta gramatyka definiuje język ze wszystkich funkcji potrzeb. W zależności od używanego oprogramowania można zdefiniować funkcje do obsługi każdej reguły. W ten sposób możesz przekształcić zapytanie tekstowe w klauzulę where gdzie.
Nie jestem naprawdę w php, ale przeszukałem sieć dla generatora analizatora składni i pojawił się PHP_ParserGenerator.
Należy pamiętać, że tak długo, jak baza danych rośnie, zapytania te mogą stać się problemem dla strukturalnego systemu pamięci masowej.
Możesz chcieć wypróbować pełnotekstową wyszukiwarkę, która pozwoli ci wykonać tę i wiele innych funkcji związanych z wyszukiwaniem tekstu. W ten sposób najpierw dodajesz (lub "indeksujesz" w dialekcie wyszukiwania) wszystkie swoje rekordy db (lub dokumenty) do IndexTank.
$api = new ApiClient(...);
$index = $api->get_index('my_index');
foreach ($dbRows as $row) {
$index->add_document($row->id, array('text' => $row->text));
}
Po tym, można szukać w indeksie ze wszystkimi operatorami chcesz
$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*');
Mam nadzieję, że odpowiedział na to pytanie.
Zwykle najpierw tokenizujesz dane wejściowe, a następnie uruchamiasz analizator składni na tokenizowanych danych. Mój [konwerter print_r] (https://gist.github.com/1102761) robi coś podobnego, jednak ma inną gramatykę. – hakre