ElasticSearch自定义排序(转载)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 转自:http://www.dcharm.com/?p=469本文讨论ES的自定义排序的两种实现形式:基于groovy脚本的自定义排序和基于native script的自定义排序。

转自:http://www.dcharm.com/?p=469

本文讨论ES的自定义排序的两种实现形式:基于groovy脚本的自定义排序和基于native script的自定义排序。

1. 基于Groovy脚本的自定义排序

ES的排序脚本必须放在config/scripts下面,ES能够自动发现这些脚本并提供对外使用, 例如编写脚本calculate-score.groovy

log(_score*2)+my_modifier

脚本中my_modifier是搜索请求中的参数,_score是ES计算得到的文档分数。发起搜索请求时指定用calculate-score排序

curl -XPOST localhost:9200/_search -d '{

"query": {

"function_score": {

"query": {

"match": {

"body": "foo"

}

},

"functions": [

{

"script_score": {

"lang": "groovy",

"script_file": "calculate-score",

"params": {

"my_modifier": 8

}

}

}

]

}

}}'

在上面的请求指定了my_modifier的值为8,排序时calculate-score脚本中对应变量my_modifier就会被赋值为8。除此以外,还可以在脚本中通过doc[‘field_name’].value或者doc[‘field_name’].value获取field data中的字段;通过_fields[‘field_name’]获取没有存放在doc values中但是放在了ES存储(store)中的字段。需要注意的是doc values会被载入到内存,而store不会,所以doc values取值速度更快。

ES会周期性的扫描config/scripts下面的文件,新增和被修改的脚本会被重新载入,并从script缓存中删除文件夹中被删除的脚本。重载的频率可以在watcher.interval中说明,默认是60s。如果要禁止重载脚本,可以设置script.auto_reload_enabled为false。

2. 基于native脚本的自定义排序

ES中的native脚本使用java语言编写,并需要实现相应的NativeScriptFactory接口。

public class CustomScriptFactory implements NativeScriptFactory {

@Override

publicExecutableScript newScript(@NullableMap params) {

returnnewCustomScript(params);

}

}

public class CustomScript extends AbstractDoubleSearchScript {

private double myVal;

private double base;

public CustomScript(@NullableMap params){

base = (Double)params.get("myVal");

}

@Override

public double runAsDouble() {

doublea = ((ScriptDocValues.Longs)doc().get("itemNum")).getValue();

returna +2;

}

}

将打包后的jar包放到ES的class path中,并在配置文件config/elasticsearch.yml中增加一行配置:

script.native.mynativescript.type: com.ymatou.search.searcher.script.CustomScriptFactory

Native脚本不能被ES自动发现,需要重启ES,另外搜索请求的格式也有些不同。

curl -XPOST localhost:19200/m2c/item/_search -d '{

"query": {

"function_score": {

"query": {

"match_all": {}

},

"functions": [

{

"script_score": {

"lang":"native",

"script":"m2c_jyh_base",

"params": {

"myVal": 10.0

}

}

}

]

}

}

}'

3. Groovy脚本自定义排序和Native自定排序的比较

相对于Native自定义排序,Groovy脚本自定义排序实现和部署方便:不用编译打包,不用修改配置文件,也不用重启ES,但是Native自定义排序的速度是Groovy脚本自定义排序速度的1到3倍,因此建议大家使用Groovy脚本做实验,但是在生产环境中使用Native脚本。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
JSON Ubuntu Java
Elasticsearch聚合学习之四:结果排序
在前面的实战中,聚合的结果以桶(bucket)为单位,放在JSON数组中返回,这些数据是没有排序的,今天来学习如何给这些数据进行排序
326 0
Elasticsearch聚合学习之四:结果排序
|
2月前
|
测试技术 定位技术 API
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
万字长文:一文彻底搞懂Elasticsearch中Geo数据类型查询、聚合、排序
94611 140
|
3月前
|
存储 自然语言处理 Java
SpringBoot集成ElasticSearch时分页排序查询时遇到的坑每次只能返回10条数据
SpringBoot集成ElasticSearch时分页排序查询时遇到的坑每次只能返回10条数据
56 0
|
11月前
|
算法 索引
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
216 0
Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询
|
11月前
|
数据挖掘
白话Elasticsearch44-深入聚合数据分析之案例实战_颜色+品牌下钻分析时按最深层metric进行排序
白话Elasticsearch44-深入聚合数据分析之案例实战_颜色+品牌下钻分析时按最深层metric进行排序
63 0
|
11月前
|
数据挖掘
白话Elasticsearch43-深入聚合数据分析之案例实战__排序:按每种颜色的平均销售额升序排序
白话Elasticsearch43-深入聚合数据分析之案例实战__排序:按每种颜色的平均销售额升序排序
57 0
|
11月前
|
测试技术 块存储 索引
《Elastic(中国)基础开发宝典》——Elasticsearch优化排序查询,更快获得结果
《Elastic(中国)基础开发宝典》——Elasticsearch优化排序查询,更快获得结果
|
12月前
|
消息中间件 JavaScript 小程序
SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮
SpringBoot+ElasticSearch 实现模糊查询,批量CRUD,排序,分页,高亮
|
存储 JSON 自然语言处理
40-微服务技术栈(高级):分布式搜索引擎ElasticSearch(DSL语法、搜索结果[排序/分页/高亮]处理)
在前面的学习中,笔者带领大家完成海量数据导入ES,实现了ES基本的存储功能,但是我们知道ES最擅长的还是搜索、数据分析。所以本节笔者将继续带领大家研究一下ES的数据搜索功能,同上节一样,继续分别采用DSL和RestClient实现搜索。
88 0
|
存储 NoSQL 算法

热门文章

最新文章