2016-02-29 43 views
0

我正在研究类似于在亚马逊网上购物的问题。同时处理多个用户搜索查询的体系结构

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

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

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

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

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

+1

为什么要重建每个查询的整个索引?我甚至读过那个吗? *当然*这很慢。不要这样做。 – femtoRgon

+1

当你说“lucene需要遍历整个数据库来索引”时,你是什么意思?你是否认真索引所有文件!?如果是,为什么? – Rushik

+0

@femtoRgon感谢您的咨询! Lucene新增功能,以及我在RAMDirectory中学习存储索引的示例,现在我意识到我应该使用FSDirectory,RAMDirectory主要用于测试。 – user2628641

回答

1

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

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

我想你会一直留下这些东西一旦这个表现留下深刻的印象。

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

1

您不必在每个搜索上建立索引。当您的服务器启动时,您可以构建您的索引(替换之前的索引)。一旦完成,您可以执行搜索引用您的索引,而不是您的数据库。这将是相当快的。

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

我宁愿更新索引,而不是在服务器重新启动时反复创建索引。为此,您可以在数据库以及索引中包含“last_updated_date”等字段。对于每个产品,这个“last_updated_date”字段会告诉你更新的信息在哪里。因此,在服务器重启时,您可以创建需要更新的产品列表并执行您的逻辑。