【问题标题】:Asynchronous Search异步搜索
【发布时间】:2010-10-28 11:26:19
【问题描述】:

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

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

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

干杯

【问题讨论】:

  • 这个场景中的“客户”是什么?它是 Java 应用程序、基于浏览器的 Web 应用程序等吗?

标签: hibernate search lucene hibernate-search


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      我会考虑以下几行:

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

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

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

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

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-19
        • 1970-01-01
        • 2011-09-11
        • 2019-04-07
        • 1970-01-01
        • 1970-01-01
        • 2016-05-12
        • 2016-07-25
        相关资源
        最近更新 更多