PHP mysql搜索查询

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这样的事情,并尽可能地优化查询.

为这个提供良好系统的任何帮助都会很棒.

谢谢,马克斯

ZJR*_*ZJR 5

但是,如果用户输入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,部分匹配查询,我们事先煮熟,改为尝试.