改进 "search" 输入字段的结果?

Improve results of a "search" input field?

我有一个包含 20,000 条记录的数据库。每条记录都有一个名称。当用户想要查看记录时,他可以访问 Web 应用程序并在输入字段中键入记录的名称。键入时,数据库的结果将 shown/filtered 与用户键入的内容相匹配。我想知道关于如何编程这个

的基本知识architecture/concepts

我正在使用以下语言堆栈: 前端:html5/javascript(+ajax 在用户输入时进行即时呼叫) 后端:java + jdbc 连接到简单的 sql 数据库

我的初步想法是:

  1. 用户键入文本
  2. 每当在输入字段中输入或删除字符时,向后端发出ajax请求
  3. 后端对数据库中的名称字段执行 LIKE %input% 查询
  4. 查询找到的所有数据都作为 json 字符串发送到前端
  5. 前端处理 json 字符串并显示它找到的任何结果

我的两个担忧是:大量 ajax 要处理的请求,以及可能非常繁重的 LIKE 查询。有什么方法可以优化这个?只搜索每两个字符 type/remove?只查询前十个结果?

您知道使用这些优化的网站吗?

注意:假设记录是人,名字就像真实的人名,所以有些名字比其他名字更常见。

您可以选择 SPA 方法 - 将所有 20 000 names/ids 加载到客户端,然后在内存中对其进行过滤 - 这应该是最快的方式,对数据库和后台的负载最小结束

以下是可能的解决方案:

  • 将搜索限制为前缀搜索 - 可以使用 BTREE 类型的索引有效地执行 LIKE 'prefix%'。
  • 测量简单的 LIKE '%str%' 解决方案的性能 - 如果您正在处理 B2B 应用程序,数据库可能会在内存中加载 table 并足够快地进行查询。
  • 查看您的数据库的文档 - 可能有特殊功能,例如倒排索引
  • 按照@Stepan Novikov 的建议,将数据加载到内存中并手动搜索
  • 使用专门的搜索索引器,如 SOLR 或 ElasticSearch(对于仅 20k 条记录可能有点矫枉过正)
  • 如果您有忍者的感觉,请实施您自己的 N-gram 索引。