java - 自定义Elasticsearch的搜索算法

标签 java lucene elasticsearch apache-tika

我最初尝试将类似的帖子发布到elasticsearch邮件列表(https://groups.google.com/forum/?fromgroups=#!topic/elasticsearch/BZLFJSEpl78),但是没有得到任何有用的答复,因此尽管我会尝试Stack Overflow。这是我的第一篇关于SO的致歉文章,如果它不完全符合其原意。

我目前正在与一所大学合作,帮助他们实现测试套件,以进一步完善他们一直在进行的一些研究。他们的研究基于动态模式搜索。在花了一些时间评估各种开源搜索解决方案之后,我选择了Elasticsearch作为基础平台,我想知道最好的处理方式是什么。我花了大约一周的时间研究Elasticsearch文档和代码本身,还阅读了Lucene的文档,但我一直在努力寻找一个清晰的前进之路。

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

研究人员的算法需要4个输入才能起作用:

  • 查询词。
  • 整个索引中的Word(术语)x文档矩阵。
  • 跨索引的Document x Word(术语)矩阵。
  • 整个索引中的单词(术语)频率列表。那就是每个单词出现在整个索引中的次数。

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

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

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

    最佳答案

    如果这是其算法的工作原理,则应在每个文档中存储1个句子。如果他们更改了模型,则始终可以重新编制索引。

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

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

    关于java - 自定义Elasticsearch的搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12682957/

    相关文章:

    elasticsearch - 带有字符串和对象的json数组在Elasticsearch中的设置映射内

    elasticsearch - 无法在同一台计算机上运行两个单独版本的Elasticsearch

    elasticsearch - 如何通过ID和过滤字段值进行过滤?

    java - 重试失败的文件上传到 AWS S3

    java - jframe 不会以恒定速率重绘

    java - 无法导入 org.apache.lucene

    java - 如何计算集合/索引中的所有 token 计数

    java - php exec() for java on website 不工作,但工作在服务器终端

    java - 动态代理和方法注解

    java - IntPoint 没有索引整数值