Ben*_*Ben 7 php mysql indexing search
我正在尝试为基于广告资源的网站创建搜索引擎.问题是我在bbtags中有信息(比如[b]test[/b] sentence,test应该被重视3,而sentence应该被重视1).
以下是索引的示例:(
My test sentence, my my具有SKU TST-DFS)
数据库:
|Product| word |relevancy|
| 1 | my | 3 |
| 1 | test | 1 |
| 1 |sentence| 1 |
| 1 | TST-DFS| 10 |
Run Code Online (Sandbox Code Playgroud)
但是,TST-DFS如果用户输入,我将如何匹配TST DFS?我希望SKU具有相关性8,而不是完整的10...
我听说MySQL中的FULL TEXT搜索功能会有所帮助,但我似乎无法找到一个好方法.我想避免像UNIONS这样的事情,并尽可能地优化查询.
为这个提供良好系统的任何帮助都会很棒.
谢谢,马克斯
但是,如果用户输入TST DFS,我将如何匹配TST-DFS?
我希望SKU具有8的相关性,而不是完整的10 ..
如果我的问题是正确的,答案实际上很简单.
好吧,如果你在将它发送到mysql之前稍微伪造一下你的查询.
好的,我们说我们已经$query包含了它TST-DFS.
我们会专注于单词跨度吗?我想我们应该像大多数搜索引擎一样,所以:
$ok=preg_match_all('#\w+#',$query,$m);
Run Code Online (Sandbox Code Playgroud)
现在,如果模式匹配 ... $m[0]包含单词的列表在$query.
这可以根据您的SKU进行微调,但是以AND方式与完整单词匹配几乎就是用户的假设.(因为它发生在谷歌和雅虎)
然后我们需要煮一个$expr表达式,将其注入到我们的最终查询中.
if(!$ok) { // the search string is non-alphanumeric
$expr="false";
} else { // the search contains words that are no in $m[0]
$expr='';
foreach($m[0] as $word) {
if($expr)
$expr.=" AND "; // put an AND inbetween "LIKE" subexpressions
$s_word=addslashes($word); // I put a s_ to remind me the variable
// is safe to include in a SQL statement, that's me
$expr.="word LIKE '%$s_word%'";
}
}
Run Code Online (Sandbox Code Playgroud)
现在$expr应该是这样的"words LIKE '%TST%' AND words LIKE '%DFS%'"
使用该值,我们可以构建最终查询:
$s_expr="($expr)";
$s_query=addslashes($query);
$s_fullquery=
"SELECT (Product,word,if((word LIKE '$s_query'),relevancy,relevancy-2) as relevancy) ".
"FROM some_index ".
"WHERE word LIKE '$s_query' OR $s_expr";
Run Code Online (Sandbox Code Playgroud)
对于"TST-DFS",应阅读:
SELECT (Product,word,if((word LIKE 'TST-DFS'),relevancy,relevancy-2) as relevancy)
FROM some_index
WHERE word LIKE 'TST-DFS' OR (word LIKE '%TST%' AND word LIKE '%DFS%')
Run Code Online (Sandbox Code Playgroud)
如您所见,在第一SELECT行中,如果匹配是部分的,则mysql将返回相关性-2
在第三个的WHERE条款,如果完全匹配失败,$s_expr,部分匹配查询,我们事先煮熟,改为尝试.