ElasticSearch - function_score (field_value_factor具体实例)

本文通过实例详细介绍了如何使用ElasticSearch的function_score查询,并着重讲解了field_value_factor如何改变文档评分,包括max_boost的限制、modifier和factor的影响,以及boost_mode在评分合并中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

阅读本文需要先了解function_score的相关知识,请看 ElasticSearch - function_score 简介


  • 首先准备数据和索引,在ES插入三笔数据,其中title是text类型,like是integer类型(代表点赞量)

    { "title": "ES 入门", "like": 2 }
    { "title": "ES 进阶", "like": 5 }
    { "title": "ES 最高难度", "like": 10 }
  • 先使用一般的query,查看普通的查询的评分会是如何

    GET 127.0.0.1/mytest/doc/_search
    {
       
        "query": {
       
            "match": {
       
                "title": "ES"
            }
        }
    }
    "hits": [
        {
       
            "_score": 0.2876821,
            "_source": { "title": "ES 入门", "like": 2 }
        },
        {
       
            "_score": 0.20309238,
            "_source": { "title": "ES 进阶", "like": 5 }
        },
        {
       
            "_score": 0.16540512,
            "_source": { "title": 
### Java Elasticsearch 开发返回值查询示例 在Java中使用Elasticsearch进行开发时,通常会涉及异步操作以及如何获取这些操作的结果。以下是关于如何处理返回值的一些方法。 #### 使用Future模式 当执行异步请求到Elasticsearch集群时,可以利用`Future<T>`接口来捕获结果。通过这种方式,程序可以在后台继续运行其他任务直到未来某个时间点再检查结果状态[^2]。下面是一个简单的例子展示如何结合线程ID与Future一起工作: ```java // 创建客户端实例 (假设已配置好连接参数) RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); String tid = String.valueOf(Thread.currentThread().getId()); SearchRequest searchRequest = new SearchRequest("index_name"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery()); searchRequest.source(sourceBuilder); Future<SearchResponse> future = client.searchAsync(searchRequest, RequestOptions.DEFAULT); try { // 获取实际响应对象并打印其内容 SearchResponse response = future.get(); System.out.println(tid + ": Response -> " + response.toString()); } catch (InterruptedException | ExecutionException e) { Thread.currentThread().interrupt(); } finally{ try {client.close(); }catch(Exception ex){} } ``` 上述代码片段展示了创建一个REST高层级API客户端,并发起了一个带有匹配所有文档条件(`match_all`) 的搜索请求。之后调用了 `searchAsync()` 方法提交该请求给服务器端同时立即返回控制权回到主线程上;最后我们通过阻塞等待机制 (`future.get()`) 来取得最终完成后的结果集。 #### CompletableFuture增强版 如果希望更灵活地管理多个并发任务或者链式调用,则推荐采用Java8引入的新特性——`CompletableFuture<T>` 类型替代传统 Future 实现方案[^3] 。它允许开发者更加优雅简洁地表达复杂的业务逻辑流程而无需担心回调地狱问题。例如: ```java public static void main(String[] args){ RestHighLevelClient client = ... ; CompletableFuture.supplyAsync(() -> performEsOperation(client)) .thenApply(result->processResult(result)) .exceptionally(ex->{logError(ex);return null;}) .join();// 阻塞直至整个链条结束 } private static Object processResult(Object result){...}; private static Object logError(Throwable throwable){...}; private static Object performEsOperation(RestHighLevelClient c)throws IOException{...;} ``` 这里演示了怎样构建一条由三个阶段组成的流水线:首先是异步执行 ES 操作函数 `performEsOperation`, 接着对其输出应用转换器 `processResult`, 如果中间发生异常则记录错误日志并通过默认值填充下游消费者输入项。注意最后一行 `.join()` 调用表示同步等待整条管道彻底结束后才往下走下一步动作. #### 自定义评分脚本 另外,在某些场景下可能还需要自定义评分规则以便更好地满足特定需求。这可以通过设置 `_score` 字段实现,如下所示给出了基于字段计算得分的一个基本模板[^4]: ```json POST /my_index/_search { "query": { "function_score": { "functions": [ { "script_score": { "script": { "inline": "(doc['field_name'].value * factor)", "params": { "factor": 1.5 } } } } ] } } } ``` 此JSON结构体描述了一种情况下的查询语句,其中运用到了 script scoring 技巧来自动生成每篇文档对应的权重分数。具体来说就是把指定属性乘以预设系数作为新标准的一部分参与排名过程之中去.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值