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

时间:2016-02-29 16:56:24

标签: architecture lucene

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

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

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

  1. 当用户输入搜索词时,Lucene将浏览整个数据库以索引每个产品
  2. 然后Lucene将返回最佳匹配产品列表
  3. 原型的问题是,当有很多用户查询时,对于每个用户,lucene需要循环遍历整个数据库以进行索引。如果用户查询,然后注销,然后再次查询,Lucene还需要再次循环..速度非常慢。

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

2 个答案:

答案 0 :(得分:1)

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

IndexSearcher是线程安全的(创建起来相对昂贵),所以你绝对想在使用它之后保留它。

我认为,一旦你保持这些东西,你将会对这种表现印象深刻。

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

答案 1 :(得分:1)

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

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

我宁愿更新索引而不是在服务器重启时反复创建。为此,您可以在数据库和索引中使用“last_updated_date”字段。对于每个产品,此“last_updated_date”字段将告诉您更新信息的位置。因此,在服务器重启时,您可以创建需要更新的产品列表并执行您的逻辑。