我正在为我的项目实现一个搜索功能。我用的是 FULL TEXT SEARCH
获取准确结果的查询 User
. 我是英语初学者 PHP
编程和我没有足够的信息 FULL TEXT SEARCH
.
我的问题是:
$sql = $conn->prepare("SELECT *, MATCH(title, keyword) AGAINST(? IN BOOLEAN MODE) AS relevance FROM table ORDER BY relevance DESC LIMIT 20");
$sql->bind_param("s", $q);
$sql->execute();
$rs = $sql->get_result();
这个查询工作得很好,但它只会首先显示旧的结果,而不是准确的结果,第二件事是当关键字的长度不超过1(例如keyword=google)时,这个查询不能正常工作。
请不要对这些问题提出建议 Elastic search
, Sphinx
, Algolia
等。
4条答案
按热度按时间whlutmcx1#
当在where子句中使用match()时,返回的行将首先以最高相关性自动排序。
因此,您所要做的就是,从select中删除匹配项并将其置于where条件中。
资料来源:https://dev.mysql.com/doc/refman/8.0/en/fulltext-natural-language.html
doinxwow2#
为什么不使用sql-like运算符,我将为您提供一个示例,说明namedproducts表中namedproduct列中的多个单词
这将为您提供一个单词或多个单词的正确结果
xu3bshqb3#
我认为您必须稍微调整一下您的查询,您将得到所需的结果,如下所示:
如果你想进行精确搜索:
我也把同样的答案贴在某处的某个帖子里,但我不知道这个帖子
y1aodyip4#
你的问题有很多方面
如果有的话,可以先使用mysql客户机来运行查询,而不是php,直到您的查询准备好了
如果要在搜索结果顶部显示最近的文档(记录),则需要更改
ORDER BY
条款。目前,它应该返回最接近的匹配(即relevance
).你需要在两者之间取得平衡
relevance
以及recency
(不清楚如何定义)在自定义逻辑中。一个简单的例子,将上周优先于上月,上月优先于其他月份:你说不能搜索单个单词项。在
BOOLEAN MODE
,您为您的搜索构建了一个布尔逻辑,因此它使用特殊字符进行搜索。例如+apple
意思是“苹果”必须存在。您的单个单词可能与这些字符冲突。请查看此参考资料,它解释了
BOOLEAN MODE
非常详细。https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html
您说查询没有返回正确的结果。
FULL TEXT
搜索在每个文档(行)中搜索您的登录并查找它在每个文档中出现的次数。然后用搜索在所有文档中出现的次数来抵消。这意味着它会优先处理那些你的搜索结果远远超过平均水平的记录。如果您的搜索没有足够的区分,那么如果大多数文档在搜索方面彼此相似,则可能看起来不正确。有关更多详细信息,请参阅上面的链接。BOOLEAN MODE
不按排序结果relevance
默认情况下。你需要自己添加订单,你已经添加了。只是想在这里给别人记下