用于同时处理多个用户搜索查询的体系结构



我正在研究一个类似于在亚马逊在线购物的问题。

有许多产品,它们的信息存储在数据库中,用户可以输入搜索词,并将返回最接近匹配的产品列表。

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

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

原型的问题在于,当有很多用户查询时,对于每个用户,lucene 需要遍历整个数据库进行索引。如果用户查询,然后注销,然后再次查询,Lucene也需要再次循环。速度很慢。

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

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

IndexSearcher 是线程安全的(并且创建成本相对较高),因此您肯定希望在使用它后保留它。

我认为一旦你保留这些东西,你会对它的性能印象深刻。

请看这个教程:http://oak.cs.ucla.edu/cs144/projects/lucene/,它看起来相当不错。

您不必在每个搜索上都构建索引。您可以在服务器启动时构建索引(替换前一个索引)。完成后,您可以参考索引而不是数据库执行搜索。这将非常快。

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

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

最新更新