好的,这将是一个较长的回答。
我认为您需要一个解析器生成器。这是一款能够根据给定语法生成代码以解析文本的软件。这些解析器通常由两个主要组成部分组成:词法分析器和语法分析器。词法分析器识别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的工作方式。
首先,您需要将所有数据库记录(或文档)添加到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*');
我希望我回答了你的问题。