3

我目前正在使用 Lucene 和 Hibernate Search 为我的公司构建概念验证搜索解决方案。我已经构建了可以正常工作的单个组件。我现在正在考虑创建一个单一的 API,允许用户从不同的来源(域 + 数据)获取搜索结果。我想要实现的是像搜索管理器异步触发搜索请求到不同的搜索组件,当一组结果被处理后,在处理其余结果时将该结果返回给用户。处理完搜索结果后,通知客户端还有更多可用的搜索结果。

我想知道我是否有一个搜索管理器,它创建单独的线程来搜索单个搜索组件并保留搜索结果列表。一旦列表填充了一组,就将其返回给用户。添加的任何其他搜索结果都将涉及搜索管理器将结果推送给用户。

我不是在寻找任何代码示例(任何将不胜感激),但我想知道是否可以就如何解决这个问题获得一些指导。我是使用事件处理技术(GigaSpaces、Spring、JMS)还是使用标准 Java 并发库。管理列表和推送更新结果的有效方法是什么。

干杯

4

3 回答 3

1

这听起来非常适合 Java 5 及更高版本中的Executor Service抽象。您可以将任务提交到执行器线程池并异步轮询完成。

因此,在您的情况下,您将创建每个搜索作为它自己的任务,然后轮询这些任务以完成。完成后,获取结果并为用户汇总它们。

于 2009-05-28T22:20:59.443 回答
0

我会研究Scatter-Gather模式:使用 JMS(或其他一些消息传递技术)异步广播查询,收集响应直到达到超时或返回最小数量的搜索结果,然后将结果报告给最终用户。

使用 JMS 或类似工具的好处是您可以避免占用多个线程等待响应,并且您有一种机制来处理在第一个结果集返回给用户之后到达的响应。

您可能想了解Solr,一个基于 Lucene 的开源企业搜索服务器,以及它们如何处理这些问题。

于 2009-05-31T15:27:11.793 回答
0

如果您为每种类型的搜索管理器创建一个类,例如 Lucene,每个都实现一个异步搜索接口,您应该能够只使用“普通”Java 的东西。

我会考虑以下几行:

创建一个线程安全的集合(如果您不想重复搜索,则为一组),具体取决于您是要排序,是随机访问其中的数据还是只是迭代。通常使用哪种数据结构。

与将集合作为参数的运行搜索方法接口 - 可能是另一种检查搜索是否已终止的方法。或者其他一些基于监听器的方法,无论你喜欢什么方法。

每种不同搜索方法的该接口的实现。每个搜索方法调用都会在调用运行搜索时创建自己的线程,该线程将搜索结果放入提供的集合中。

搜索管理器只是遍历所有已知的搜索引擎(在某处注册)并使用给定的查询对每个搜索引擎进行搜索。

希望有帮助。

于 2009-05-28T19:05:17.887 回答