6

我最初尝试将类似的帖子发布到 elasticsearch 邮件列表(https://groups.google.com/forum/?fromgroups=#!topic/elasticsearch/BZLFJSEpl78),但没有得到任何有用的回复,所以我想试试堆栈溢出。这是我关于 SO 的第一篇文章,如果它不完全符合它的意图,我深表歉意。

我目前正在与一所大学合作,帮助他们实施测试套件,以进一步完善他们正在进行的一些研究。他们的研究基于动态模式搜索。在花了一些时间评估各种开源搜索解决方案后,我选择了弹性搜索作为基础平台,我想知道最好的方法是什么。我花了大约一周的时间研究 elasticsearch 文档和代码本身,还阅读了 Lucene 的文档,但我很难找到明确的前进方向。

该项目的目标是为研究人员提供一款软件,他们可以使用该软件来插入搜索算法的修订版以进行测试和改进。他们希望能够用除 Java 之外的语言编写可插拔算法,这些语言受 JVM 支持,如 Groovy、Python 或 Closure,但这不是硬性要求。其中一部分是为他们提供一个前端来运行查询和查看输出,以及一个管理界面来将文档添加到索引中。由于非常强大和完整的 REST API,我对所有这些都很满意。我不太确定的是如何继续实现可插入搜索算法。

研究人员的算法需要 4 个输入才能运行:

  1. 查询词。
  2. 跨索引的 Word(术语)x 文档矩阵。
  3. 跨索引的 Document x Word(术语)矩阵。
  4. 索引中的单词(术语)频率列表。这是每个单词在整个索引中出现的次数。

出于他们的目的,文档并不对应于实际的真实世界文档(他们实际上称它们为文本事件)。相反,就目前而言,它对应于一个句子(具有可配置性也可能有用)。我认为处理这个问题的最佳方法是将文档分解成句子(使用 Apache Tika 或类似的东西),将每个句子作为自己的文档放入索引中。我相信我可以在我提供的管理 UI 中使用映射器附件插件作为起点来执行此操作。不利的一面是,在将文档提供给 elasticsearch 之前对其进行分解并不是一种非常可配置的方式。如果他们想将分辨率更改为他们的算法,他们需要再次将所有文档重新添加到索引中。如果索引按原样存储完整的文档,并且搜索算法可以选择每个查询的工作分辨率,那么这将是完美的。我不确定这是否可能。

下一个问题是如何获取他们需要的三个输入并将其传递给他们的可插入搜索算法。我真的很挣扎从哪里开始。从 Luecene 看来,我需要提供自己的搜索/查询实现,但我不确定这是否正确。elasticsearch 网站上似乎也没有列出任何搜索插件,所以我什至不确定是否可能。这里重要的是,在使用模式对索引中的每个文档进行评分之前,算法需要在索引级别使用可用于生成其模式的查询术语进行操作。据我所知,这意味着elasticsearch提供的脚本接口将没有任何用处。elasticsearch 指南中对脚本接口的描述听起来像是在文档级别而不是索引级别运行的脚本。其他关注点/考虑因素是能够以多种语言对该算法进行编程(就像脚本接口一样)以及增强 REST API 返回的内容以进行搜索以包含算法生成的模式的能力(我假设这意味着我需要定义自己的 REST 端点)。

任何人都可以给我一些关于从哪里开始的建议吗?看来我将不得不编写自己的搜索插件,它可以接受脚本作为它的核心算法。在将控制权传递给脚本之前,该插件将负责组织我之前概述的 4 个输入。它还将负责从脚本中获取输出并通过它自己的 REST API 返回它。这看起来合乎逻辑吗?如果是这样,我该如何开始这样做?我需要查看代码的哪些部分?

4

1 回答 1

0

如果他们的算法是这样工作的,您应该为每个文档存储 1 个句子。如果他们改变了他们的模型,你总是可以重新索引。

Lucene 非常擅长寻找匹配项,所以我怀疑你同事的算法会处理得分问题。ElasticSearch 支持自定义评分脚本。您可以将参数传递给给定的评分脚本。您可以在 ES 中使用 groovy 编写脚本。 http://www.elasticsearch.org/guide/reference/modules/scripting.html

要在搜索算法中使用更大的数据结构,将这些数据结构作为参数传递是没有意义的,您可能会发现在评分脚本中使用其他数据源很有用。例如 Redis:http: //java.dzone.com/articles/connecting-redis-elasticsearch

于 2013-01-25T10:08:34.017 回答