同时处理多个用户搜索查询的架构

Architecture for handling multiple user searching query at same time

我正在处理类似于在亚马逊网上购物的问题。

有很多产品,它们的信息存储在数据库中,用户可以输入搜索词,然后将return编出最匹配的产品列表。

目前我正在使用 Lucene 来处理搜索过程。这是一个非常简单的架构:

  1. 当用户输入搜索词时,Lucene 将遍历整个数据库以索引每个产品
  2. 然后 Lucene 将 return 一个最匹配的产品列表

原型的问题是,当有很多用户查询时,对于每个用户,lucene需要循环遍历整个数据库来索引。而且如果用户查询,然后登出,再查询,lucene也需要再循环一遍。。速度很慢。

那么有什么方法可以改善这一点(或技术选择)?

当您创建 lucene 索引(使用索引编写器)时,您应该使用 FSDirectory 对象来获取文件。这是存储索引的位置。用户应该使用共享的 IndexSearcher 来搜索这个索引。

IndexSearcher 是线程安全的(并且创建起来相对昂贵),因此您肯定希望在使用后保留它。

我认为一旦您将这些东西放在身边,您会对它的性能印象深刻。

请看一下这个教程:http://oak.cs.ucla.edu/cs144/projects/lucene/,看起来还不错。

您不必在每次搜索时都建立索引。您可以在服务器启动时构建索引(替换之前的索引)。完成后,您可以参考索引而不是数据库执行搜索。这会很快。

现在有些产品价格可能会发生变化,或者与任何产品相关的任何数据可能会 change/added/updated。在这种情况下,您可以将信息更新到您的数据库中,并且当您的服务器重新启动时,您可以重建您的索引。

我宁愿更新索引也不愿在服务器重新启动时一次又一次地创建。为此,您可以在数据库和索引中有一个像 "last_updated_date" 这样的字段。对于每个产品,此 "last_updated_date" 字段将告诉您更新信息的位置。因此,在服务器重新启动时,您可以列出需要更新的产品并执行您的逻辑。