[英]Search Engine Keywords Parser
这是我想做的:
我需要创建一个使用以下运算符的搜索引擎解析器:
使用一些preg_replace,我设法将字符串转换为数组,然后解析该数组以获取MySQL查询。 但是我不喜欢这样,而且非常不稳定!
我在网上搜索了一些脚本,但没有运气!
有人可以帮我实现这个吗?
谢谢
好的,这将是一个很大的答案。
我认为您需要的是一个解析器生成器。 一款可生成代码以根据给定语法解析文本的软件。 这些解析器通常具有2个主要组件:词法分析器和解析器。 词法分析器识别令牌(单词),解析器根据您的语法检查令牌顺序是否正确。
在词法分析器中,您应该声明以下标记
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*');
希望我回答了你的问题。
另外,这也不是您要找的内容,而是可能要关闭: MySQL全文搜索 。
你看过ANTLR了吗
您可以进行如下自制程序( 重要: $search
字符串必须首先经过清理或被黑)...
if (substr($search[0]=='*' and substr($search,-1)=='*') {
// *ppl*
$query = "SELECT * FROM `table` WHERE `field` LIKE (%'". str_replace('*','',$search) ."%')";
} elseif (substr($search,-1)=='*') {
// Appl*
$query = "SELECT * FROM `table` WHERE `field` LIKE ('". str_replace('*','',$search) ."%')";
} elseif ($search[0]=='*') {
// *Appl
$query = "SELECT * FROM `table` WHERE `field` LIKE ('%". str_replace('*','',$search) ."')";
} elseif (substr_count($search,'"')==2) {
// " Apples " ... just remove the "
$query = 'SELECT * FROM `table` WHERE `field` = "'. str_replace('"','',$search) .'"';
} elseif (strpos($search,')') or strpos($search,'(')) {
// uh ... something more complex here
$query = '#idunno';
} else {
// the rest
$query = 'SELECT * FROM `table` WHERE `field` = "'. $search .'"';
$search = array(
' AND ',
' OR ',
' AND NOT '
);
$replace = array(
'" AND `field` = "',
'" OR `field` = "',
'" AND `field != "'
);
str_replace($search,$replace,$query);
}
试试这个: http : //www.isearchthenet.com/isearch/index.php
从自述文件:
它易于安装和使用。 另外,请访问http://sphinxsearch.com/-最强大的引擎,但不适用于新手。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.