2013-08-30 60 views
11

使用以下类型的脚本在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] 

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

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

+0

看起来你必须创建和注册自定义的Java脚本和查询(也提供了“郎”:“原生”参数)引用它。 我绝不是Java专家,但没有对如何创建这样的脚本一个很好的教程:https://github.com/imotov/elasticsearch-native-script-example 退房随机排序脚本到底,因为它似乎成为你需要的东西。 –

+0

感觉就像任何非MVEL脚本必须作为插件来实现;内联脚本不允许用于非MVEL脚本。任何人都可以证实吗? –

+0

我也尝试过js - 你仍然需要安装一个插件来启用js支持,但是你可以做内联表达式:“sort”:{ “_script”:{ “script”:“doc ['date'] .value *因子+ 'anyvaluehere”', “类型”: “串”, “PARAMS”:{ “因子”:1.1 }, “顺序”: “ASC”, “郎”: “JS” }} –

回答

4

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

另一方面,我看到你在这里的问题有更多的细节,我一直在想,你是否可以避免使用脚本排序来实现你想要的。

您的用例让我想起最近添加的rescore query,它允许使用辅助查询重新排名前K个结果。请考虑在每个分片上执行rescore。所以,如果你问的第10个文件中,rescore将发生在每个碎片前10个文件,这将会影响在减少阶段获得入选前10个文件。听起来你更喜欢改变返回的文档的顺序,而使用rescore查询这些文档可能会由于rescore过程本身而改变。

即将到来的版本0.90.4也将包含随机种子排序,这应该可以帮助您进行排序的随机方面。看看related issue了解更多。

会很酷一个rescore查询与功能评分查询,允许随机排序相结合。

+0

随机播种顺序是一个很好的替代品。感谢您在邮件列表中找到导致此问题的确切提交。 –