我对如何最好地接近网站搜索组件感到迷茫。我有一个类似于yelp的用户内容网站。人们可以搜索本地地点,本地事件,本地照片,成员等。因此,如果我在搜索框中输入“Tom”,我希望搜索返回与Tom匹配的所有用户对象的结果。现在,汤姆可以在任何地方,如餐馆名称或餐厅或评论的描述,或某人的评论等。
因此,如果我纯粹使用规范化的sql设计它,我将需要连接大约15个对象表来扫描所有不同的用户对象+扫描每个表中的多个colunms以搜索所有字段/ colunms。现在我不知道这是正常的做法还是有更好的方法?我见过像Solr / Apache / Elasticsearch这样的东西,但我不确定这些是如何适应myusecase的,即使我使用这些我还假设我还需要扫描所有15个表+ 30-40个colunms正确吗?我的平台是php / mysql。此外,还有任何编码/组件架构/数据库设计实践吗?一位朋友说我应该将所有对象合并到一个表中,但由于你不能将照片,视频,评论,页面,配置文件等组合到一个表中,所以我不知道如何实现它。
答案 0 :(得分:1)
可能你的朋友意味着将所有可搜索的字段合并到一个表中。
基本思想是创建一个充当索引的表。一列是可索引的并且存储单词,而另一列包含对在其中一个字段中包含该单词的对象的引用列表(例如,对象可以是图片,其可搜索的字段可以是标题和注释)。
引用列表可以以多种方式存储,因此您可以例如具有可变长度的字符串,例如BLOB,并且在其中存储JICS编码的ID&数组。对象的类型,以便您可以通过在对应于对象类型的表中搜索该id来轻松找到它们。
当然,在对可索引数据进行任何添加/删除/修改时,您应该相应地更新索引(但是您可以使用延迟更新技术最终在后台更新索引 - 这是因为大多数人都希望索引在几分钟内准确到达目前的数据状态。这样一个索引的一个实现是Apache Cassandra,但我不会将它用于小规模的项目,你不应该需要分布式数据库等。