繁体   English   中英

如何实现搜索功能?

[英]How to implement search feature?

我的表中有一个关键字字段,它存储所有以逗号分隔的关键字。 现在,我有一个输入词,我想使用表中的关键字字段从表中搜索与该输入匹配的所有项目。 有没有更好的方法,或者唯一的方法是对整个表进行线性搜索。

一个例子。

现在你有一个看起来像这样的存储:

group_id | keywords
-----------------------------------------
   ...   |  ...
   123   |  word1,word2,word3
   124   |  word5,word2
   125   |  word3,word4,word1,word7,word8
   ...   |  ...

你把它转换成

group_id | ordinal | keyword
----------------------------
   ...       ...     ...
   123        1      word1
   123        2      word2
   123        3      word3
   124        1      word5
   124        2      word2
   125        1      word3
   125        2      word4
   125        3      word1
   125        4      word7
   125        5      word8
   ...       ...     ...

当您需要包含例如'word2'组的组标识符时,您执行

SELECT group_id 
FROM keywords
WHERE keyword = 'word2'

这将返回

group_id
--------
  123
  124

当您需要执行整个关键字组时

SELECT group_id, GROUP_CONCAT(group_id ORDER BY ordinal) keywords
FROM keywords
JOIN ( SELECT group_id 
       FROM keywords 
       WHERE keyword = 'word2' ) AS groups USING (group_id)

这将返回

group_id | keywords
-------------------------------
   123   |  word1,word2,word3
   124   |  word5,word2

为了提高性能,您需要在表结构中创建适当的索引(通过(keyword, group_id)(group_id) )。

我将推荐使用专用搜索索引。 Akina 的回答非常适合完全在 MySQL 内完成此操作。不过,如果你想在like '%ave%'上匹配Dave ,你需要阅读FULLTEXT索引;MySQL 说明书

但是,使用这种结构,您只是构建了一半的搜索索引。 最好在堆栈中引入一个真正的搜索索引。 如今,使用 Laravel 和 Symfony 的库,或者仅使用 PHP 驱动程序(需要一些组装),Elastic 真的很容易实现。 一旦您有了搜索索引,它就会提供额外的好处,例如自动多元化搜索,甚至会返回按匹配分数排序的结果。

您需要做的就是创建一个包含一个字段的搜索索引,并为 MySQL 数据库中的每条记录用空格分隔其中的所有单词。 您的 Elastic 记录将如下所示:

{
    "_id": "[Elastic's record ID]",
    "mysql_id": "[Your ID in MySQL]",
    "search_field": "word1 word2 word3"
}

搜索该索引将为您返回搜索的 MySQL ID,然后您可以在 PHP 应用程序中补充这些 ID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM