ElasticSearch5.X script_fields 解释及例子

前言:es6.X 有所改变 本例子只测试了 5.X,但是道理嘛 都一样。看下6.X的文档再看一下本文就懂了。

DSL1:

#直接用文档的某个字段做计算
GET /quality_control/my_type/_search
{
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "test1": {
      "script": {
        "lang": "painless",
        "inline": "doc['qce_id'].value * 2"
      }
    }
  }
}

result:



DSL2:

#自定义参数 params 可以和文档中某个字段 做计算
GET /quality_control/my_type/_search
{
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "test2": {
      "script": {
        "lang": "painless",
        "inline": "doc['qce_id'].value / params.factor * params.yb",
        "params": {
          "factor": 2.222,
          "yb": 51
        }
      }
    }
  }
}

result:



DSL3:

#可以获取文档中的某个字段的值
GET /quality_control/my_type/_search
{
  "query": {
    "match_all": {}
  },
  "script_fields": {
    "test1": {
      "script": "params['_source']['qc_content']"
    }
  }
}

result:


注:DSL3 和 下面这个Doc value Fields例子 很像:
GET /quality_control/my_type/_search
{
    "query" : {
        "match_all": {}
    },
    "docvalue_fields" : ["qc_type", "qc_content"]
}

result:



doc['my_field'].value和params['_source']['my_field']的区别:

理解之间的区别是很重要的 doc['my_field'].value和params['_source']['my_field']。首先,使用doc关键字,将导致该字段的条件被加载到内存(缓存),这将导致更快的执行,但更多的内存消耗。此外,doc[...]符号只允许简单的有价值的领域(不能从它返回一个JSON对象),只有在非分析或单个词条的基础上有意义。但是,doc如果可能,使用仍然是从文档访问值的推荐方式,因为_source每次使用时都必须加载并解析。使用_source非常缓慢。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用 Elasticsearch 的 Java API 来实现 es8.x script_score 定制搜索结果的分数。具体实现步骤如下: 1. 创建一个 SearchRequest 对象,设置索引名称和查询条件。 2. 创建一个 ScriptScoreFunctionBuilder 对象,设置脚本语言和脚本内容。 3. 将 ScriptScoreFunctionBuilder 对象添加到 FunctionScoreQueryBuilder 中。 4. 创建一个 SearchSourceBuilder 对象,设置查询条件和排序方式。 5. 将 FunctionScoreQueryBuilder 对象添加到 SearchSourceBuilder 中。 6. 执行查询并获取结果。 以下是示例代码: ``` SearchRequest searchRequest = new SearchRequest("index_name"); QueryBuilder queryBuilder = QueryBuilders.matchQuery("field_name", "search_text"); ScriptScoreFunctionBuilder scriptScoreFunctionBuilder = new ScriptScoreFunctionBuilder( new Script(ScriptType.INLINE, "painless", "doc['field_name'].value * factor", Collections.singletonMap("factor", 2.0))); FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(queryBuilder, scriptScoreFunctionBuilder); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(functionScoreQueryBuilder); searchSourceBuilder.sort(SortBuilders.scoreSort()); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); ``` 其中,ScriptScoreFunctionBuilder 中的脚本语言为 painless,脚本内容为 doc['field_name'].value * factor,表示将文档中的某个字段的值乘以一个因子作为分数。FunctionScoreQueryBuilder 中的 queryBuilder 表示查询条件,scriptScoreFunctionBuilder 表示定制分数的方式。最后,将 FunctionScoreQueryBuilder 对象添加到 SearchSourceBuilder 中,并执行查询。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值