【问题标题】:Elastic search sort script not working after upgrade升级后弹性搜索排序脚本不起作用
【发布时间】:2013-09-07 05:40:47
【问题描述】:

以下排序脚本曾经在 0.2 中工作,但现在在 0.9 中失败:

{
  "_script": {
    "script": "org.elasticsearch.common.Digest.md5Hex(doc['myId'].value + 12345)",
    "type": "string",
    "order": "asc"
  }
}

我收到的错误是:

PropertyAccessException[[Error: unresolvable property or identifier: org]

我看到一些帖子建议创建一个自定义分数查询来完成这项工作,所以需要一些额外的信息。我已经在使用自定义分数查询,这种排序是分数匹配时的二级排序,可以(并且应该)定期发生。上例中的常数基于执行搜索的人,因此每个搜索的人都会得到随机但一致的排序,我们并不总是在顶部向每个人显示相同的结果。

我找不到任何关于为什么会发生这种情况以及如何在保留相同排序功能的同时修复它的信息。任何帮助或指出我新的方向将不胜感激。

【问题讨论】:

  • 看起来您必须创建和注册自定义 java 脚本并在查询中引用它(还提供“lang”:“native”参数)。我绝不是 Java 专家,但有一个关于如何创建此类脚本的不错的教程:github.com/imotov/elasticsearch-native-script-example 最后查看随机排序脚本,因为它似乎是您需要的。
  • 感觉任何非MVEL脚本都必须作为插件实现;非 MVEL 脚本不允许使用内联脚本。谁能确认一下?
  • 我也试过 js - 你仍然需要安装一个插件来启用 js 支持但是你可以做内联表达式:“sort”:{“_script”:{“script”:“doc [” date'].value * factor + 'anyvaluehere'", "type": "string", "params": { "factor": 1.1 }, "order": "asc", "lang": "js" } }
  • @NickLarsen 内联脚本支持除 java 之外的所有语言,您需要为此编写 Java 代码并在 es 类路径中提供编译后的版本。唯一的问题是,对于其他语言,您需要安装适当的语言插件。

标签: elasticsearch


【解决方案1】:

我在邮件列表中回复了您的帖子,问题是由于org.elasticsearch.common.Digest已从elasticsearch中删除。我不认为你可以用一行来替换它,如果你熟悉 Java,可能更容易编写 Java 原生脚本。

另一方面,我看到您在这里的问题中有更多详细信息,我一直想知道您是否甚至可以避免使用脚本排序来实现您想要的。

您的用例让我想起了最近添加的rescore query,它允许使用辅助查询重新评分前 K 个结果。请考虑在每个分片上执行重新评分。因此,如果您要求前 10 个文档,则重新评分将发生在每个分片的前 10 个文档上,这将影响在缩减阶段选择的前 10 个文档。听起来您更希望更改返回文档的顺序,而通过重新评分查询,这些文档可能会由于重新评分过程本身而发生变化。

即将发布的 0.90.4 版本也将包含随机种子排序,这将有助于您进行排序的随机方面。查看related issue 了解更多信息。

将重新评分查询与允许随机排序的函数评分查询结合起来会很酷。

【讨论】:

  • 随机播种顺序是一个很好的替代品。感谢您在邮件列表中找到导致此问题的确切提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多