[英]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.