Elastic Search使用ids来排序的例子

弄了半天,终于在全部环境下搞店。

我自己的版本:(PHP)

$this->es_sort = [
    '_script'=>[
        "script"    =>  "ids.indexOf(doc['_uid'].value.replace('{$this->type}#',''));",
        "type"      =>  "number",
        "params"    => [
            "ids"   =>  $ids
        ],
        "order"     =>  $order
    ]
];如果是纯Query的版本,我也放一个出来给大家方便测试吧:(请自行修改ID及type的值)

{
    "query": {
    "ids": {
        "values": [
            "55088c72662a07fd758b457a",
            "551fd6d6662a078ffe8b4578"
        ]
    }
  },
  "sort": {
    "_script": {
        "script": "return ids.indexOf(doc['_uid'].value.replace('product#',''));",
      "type": "number",
      "params": {
            "ids": [
                "55088c72662a07fd758b457a",
                "551fd6d6662a078ffe8b4578"
            ],
        "order": "sac"
      }
    }
  }
}我测试的elastic版本分别有:1.1、1.4.1、1.5.3,都不一样。我大概总结一下。

1、网站这个获得当前文档的_id值的方法现在新的ES都不能用了。

id    = org.elasticsearch.index.mapper.Uid.idFromUid(doc['_uid'].value);

2、我用一个迂回的方法拿到这个_id,留意这句:

ids.indexOf(doc['_uid'].value.replace('{$this->type}#',''));

3、还有最要命的一个问题,一开头我怎么测试都不行,弄了大半天。后来很仔细看那一长段的exception信息,我怀疑是新版的ES安全性考虑,把默认的script语言groovy屏蔽了。

4、1.5.3之后,以及1.4.8,都默认不再支持_groovy。怎么办?如果按照他文档建议的方式,通过一个文件来传递脚本,无疑太笨了。我研究了半天,发现可以在ES的配置文件里加这句:

script.groovy.sandbox.enabled: true

重启ES,搞定,可以用了。

5、你要说不安全嘛?当然,ES建议你可以使用express language,那个实在有点弱,好像不支持indexOf。我实在是一个很懒和不愿意把代码变长的程序员。

如果你有更好的方法,欢迎告诉我。

时间: 2024-10-20 07:44:30

Elastic Search使用ids来排序的例子的相关文章

手把手教学:使用Elastic search和Kibana进行数据探索(Python语言)

探索性数据分析(EDA)帮助我们认识底层的数据基结构及其动力学,以此来最大限度发掘出数据的可能性.EDA是提取重要变量和检测异常值的关键.尽管存在着很多种机器学习算法,但EDA仍被视为理解和推动业务的最关键算法之一. 其实有很多种方式都能够执行实现EDA,例如Python的matplotlib.seaborn库,R语言的ggplot2,而且网络上有很多很好的资源,例如John W. Tukey的"探索性数据分析", Roger D. Peng 的"用R进行探索性数据分析&qu

【Spark Summit East 2017】使用Spark, Kafka和Elastic Search的大规模预测

本讲义出自Jorg Schad在Spark Summit East 2017上的演讲,主要介绍了使用Spark, Kafka和Elastic Search的大规模预测的方法以及案例,并分享了分布式计算以及数据分析预测应用的架构设计思想.

Elastic search点点滴滴

在打造集中化日志那篇中,稍微提了下Elastic search. Elk打造集中化日志 Elastic search是Elk的核心,写的时候重点也放在它上面,不过还是觉得深度挖掘得不是太够,所以决定再另写一篇重点介绍下Elastic search. 正如那一篇博客提到的,如果你不是喜欢夜店咖,就像千千万万的程序员一样喜欢本本分分的女人,最好再稍微带几分姿色,那选ES准没错. ES集群 正如Elastic的本义一样,ES就是为扩展而生.它天生就是支持分布式的,这意味着我们可以对ES进行横向扩展,而

Elastic Search 与 mysql数据库实时同步的问题

问题描述 Elastic Search 与 mysql数据库实时同步的问题 我知道有一个工具叫ElasticSearch-jdbc,也看了官方文档,根据官方文档写了个测试(命令见最下),但是不能实时同步,它会隔差不多1分钟左右再更新.不知道是什么地方出问题了.还请路过大神不吝赐教!命令: {type"" : ""jdbc""jdbc"" : {url"" : ""jdbc:mysql:/

Asp.net实现向上向下排序的例子

  工作中一些常用到的代码记录下来,方便自己查找也方便其他需要人士参考. 废话不多说,这是一个向上向下排序的功能,首先使用存储过程 整好 如下: SQL: -- ============================================= -- Author: -- Create date: -- Description: -- ============================================= ALTER PROCEDURE [dbo].[sp_Banne

Yii框架实现数据分页及排序的例子

在控制器:  代码如下 复制代码 class PostController extends Controller {     function actionIndex()     {         $criteria = new CDbCriteria();         $count=Post::model()->count($criteria);         $pages=new CPagination($count);           // elements per page

php中有序的数组打印或排序的例子

最近有个面试题挺火的--把俩个有序的数组打印或排序.刚看到这个题的时候也有点蒙,最优的算法肯定要用到有序的特性. 思考了一会发现也不是很难,假如数组是正序排列的,可以同时遍历俩个数组,将小的值进行排序,最后会遍历完一个数组,留下一个非空数组,而且剩下的值肯定大于等于已经排好序的最大值. PHP代码之 <?php     function sort_arr($a,$b) {         $temp = array();         while ($a&&$b) {       

JavaScript中文排序的例子

使用系统函数 String.localeCompare 比较大小, Array.sort 排序 即可完成 var arr = ['中','国家','上帝','零度']; var result = arr.sort(function(a,b){    return a.localeCompare(b);  //["国家", "零度", "上帝", "中"] }) 这是W3Cschool上的原话: localeCompare()

Python对两个有序列表进行合并和排序的例子_python

假设有2个有序列表l1.l2,如何效率比较高的将2个list合并并保持有序状态,这里默认排序是正序. 思路是比较简单的,无非是依次比较l1和l2头部第一个元素,将比较小的放在一个新的列表中,以此类推,直到所有的元素都被放到新的列表中. 考虑2个列表l1 = [2], l2 = [1],如何将他们合并呢?(注意:下面实现会改变l1和l2本来的值) 复制代码 代码如下: def signle_merge_sort(l1, l2):    tmp = []    if l1[0] < l2[0]: