elastic 比较mapping里边2个变量的大小

一:传统方式可以用脚本


GET /_search { "query": { "bool" : { "must" : { "script" : { "script" : { "inline": "doc['field1'].value > doc['field2'].value", "lang": "painless" } } } } } }

Script Queryedit

A query allowing to define scripts as queries. They are typically used in a filter context, for example:

GET /_search
{
    "query": {
        "bool" : {
            "filter" : {
                "script" : {
                    "script" : {
                        "source": "doc['num1'].value > 1",
                        "lang": "painless"
                     }
                }
            }
        }
    }
}

COPY AS CURLVIEW IN CONSOLE 

Custom Parametersedit

Scripts are compiled and cached for faster execution. If the same script can be used, just with different parameters provider, it is preferable to use the ability to pass parameters to the script itself, for example:

GET /_search
{
    "query": {
        "bool" : {
            "filter" : {
                "script" : {
                    "script" : {
                        "source" : "doc['num1'].value > params.param1",
                        "lang"   : "painless",
                        "params" : {
                            "param1" : 5
                        }
                    }
                }
            }
        }
    }
}

java api 的构建

    public static BoolQueryBuilder buildTodayFormalClosedCountBuilder(StatisticsRequest request) {
        BoolQueryBuilder boolQueryBuilder = buildConditionQuery(request);
        boolQueryBuilder.filter(QueryBuilders.termQuery(CaseDbEsRelEnum.STATUS_ID.getEsName(), 2));
        boolQueryBuilder.filter(QueryBuilders.scriptQuery(new Script("doc['closeTime'].value < doc['deadline'].value")));
        boolQueryBuilder.filter(QueryBuilders.termQuery(CaseDbEsRelEnum.TIMEOUT_CLOSE_FLAG.getEsName(), 0));
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.add(Calendar.DATE, 0);
        boolQueryBuilder.filter(QueryBuilders.rangeQuery(CaseDbEsRelEnum.CLOSE_TIME.getEsName()).gt(calendar.getTime()));
        return boolQueryBuilder;
    }

二:其实可以用一个变量标志来代替脚本的,因为脚本相对比较耗时

 比如在过滤中 addtime < closetime

可以在 通过接受dababus的变更通过kafka发出来的消息,对eslastic 进行数据写入的时候,增加一个变量比较2个变量,来对一个新的falg 标志变量进行赋值。

最好是在索引阶段就单独索引一个字段,用来存放2个field大小比较的结果,比如字段名称为 field1_lg_field2, 可以存放1/0用于表示那个字段大, 这样在搜索过滤的时候速度比使用script临时计算要快得多。
 
ES搜索的最佳实践是将开销都放在数据索引阶段,搜索阶段尽量用最简单的查询,这是提升查询效率的关键。

猜你喜欢

转载自blog.csdn.net/u010325193/article/details/85391490