3

我一直在努力解决这个问题,所以我最终决定把它放在 Stackoverflow 上,希望有人能帮我解决这个问题。

让我勾勒出问题:

  • 自动建议功能最基本的用法是在每次击键时查询数据库。

这种方法的优点是您始终可以获得最新的结果。

缺点是它可能很慢,并且基本上在每次击键时都处理您的数据库是多余的。假设您想自动建议一个国家/地区表,搜索“美国”之类的内容会在数据库上生成 7 个 SELECT 查询!因此,这种方法不是一种选择。

  • 第二个选项(我目前正在使用的)是收集所有可能的结果并将其保存到 JSON 格式的平面文件中。所以基本上你会拥有一个文件,例如 countries.json 包含所有国家。我没有查询数据库,而是指向国家/地区的 json 文件,每次击键都会在加载的 json 文件中进行搜索。

这种方法速度很快,并且利用了数据库。在国家/地区的示例中,这将是一个很好的解决方案,因为内容不是很动态并且不包含那么多数据,因此 json 平面文件将非常小,因此下载速度很快。

但是当 json 文件包含动态数据并且数据集很大时,就会出现问题。如果你想建立一个包含所有电影和演员的自动建议搜索怎么办?将所有结果放在一个 json 文件中将是荒谬的,因为该文件可能太大而无法下载。我们以 IMDB(www.imdb.com)为例。他们的网站上有自动建议功能。搜索电影名称或演员的速度非常快,并且可以搜索数十万条记录。深入研究他们的方法,我注意到以下几点:

如果您使用 Google Chrome 调试窗口(或Filezilla Firefox Firebug):在网络选项卡中查找脚本。例如,当您键入“星球大战”时,您会注意到通过键入每个字母会加载一个单独的 json 文件。首先是s.json,然后是 st.jsonsta.json等......它停在star_w.json 显然它总是停在第 6 个字母。

它加载的每个 json 文件都包含 8 个匹配字母的结果。似乎有 36 个文件夹与字母表中的每个字母(包括数字)相匹配。例如, star_w.json的链接是http://sg.media-imdb.com/suggests/s/star_w.json

我的问题是你将如何构建一个类似的智能系统?他们是否有 6 个字母的所有可能组合作为 json 文件?您将如何生成文件?另请注意,它不仅会查看标题的开头来进行匹配。因此,如果您搜索“战争”,您还会在搜索结果中找到“星球大战”。

任何帮助找出构建类似系统的帮助将不胜感激。我认为该系统非常整洁和快速,可以用于多种用途!

编辑

好的,解决了。我的解决方案是结合查询数据库和将结果缓存在平面 json 文件中。基本上,当用户键入例如“星球大战”时,每次击键我都会首先检查是否有用于搜索字符串的 json 文件。如果它存在,我将只显示 json 文件的内容。如果文件不存在或者文件早于您设置的某个时间限制(例如早于 12 小时),则查询数据库并在 json 中回显输出。同时将输出写入 json 文件。下次您进行搜索时,它只会从平面文件中获取内容,而不是从数据库中获取内容(直到达到 TTL)。我已将字母的长度限制为 6 个字母,因此如果搜索字符串大于 6 个字母,则不会发生任何事情,明星_w

使用此方法,缓存的 json 结果的集合会根据用户输入自动填充。您还可以编写一个脚本来循环您的表并生成 json 文件...

我知道这不是完美的解决方案,但这样至少您可以通过将结果缓存在平面文件中来承担一些数据库负载。

4

1 回答 1

0

我会使用一些创建索引的搜索引擎软件,比 RDMS 提供的更适合这些场景。

看看 Softbool 的 Boolware: http: //www.softbool.se/(单击英文)链接...

可怕的网页,伟大的产品。

于 2012-02-02T13:47:34.300 回答