Elasticsearch-关键词随机查询(8.x)

目录

一、查询语句

二、Java代码实现


基础介绍:

ES自定义评分机制:function_score查询详解-阿里云开发者社区ES自定义评分机制:function_score查询详解icon-default.png?t=N7T8https://developer.aliyun.com/article/1054571

开发版本详见:Elasticsearch-经纬度查询(8.x-半径查询)_es经纬度范围查询-CSDN博客

本案例只展示随机查询,具体查询权重需根据自身业务修改

一、查询语句

GET /article-test-read/_search
{
  "query": {
    "function_score": {
      "query": {
        "match_phrase": {
          "content": "长沙"
        }
      },
      "functions": [
        {
          "random_score": {
            "field": "_seq_no",
            "seed": 100
          }
        }
      ],
      "score_mode": "multiply"  // 将随机分数与其他查询分数相乘
    }
  }
}

二、Java代码实现

具体查询对象,可自行定义,本方法只提供思路,莫直接粘贴使用

        // 封装ES查询参数
        BoolQuery.Builder boolQueryBuilder = new BoolQuery.Builder();
        // 封装ES查询参数
        List<Query> shouldList = new ArrayList<>();
        // 笔记关键词查询
        Query byIkTitle = MatchQuery.of(match -> match.field("title")
                .query(request.getSearch()).boost(2.0f))._toQuery();
        shouldList.add(byIkTitle);
        Query byIkContent = MatchQuery.of(match -> match.field("content")
                .query(request.getSearch()))._toQuery();
        shouldList.add(byIkContent);
        boolQueryBuilder.should(shouldList).minimumShouldMatch("1");

        // 随机查询
        long randomValue = RandomUtil.randomLong(665359, 159265359);
        FunctionScoreQuery functionScoreQuery = FunctionScoreQuery.of(f -> f.query(q -> q.bool(boolQueryBuilder.build()))
                .functions(fn -> fn.randomScore(r -> r.field("_seq_no").seed(String.valueOf(randomValue))))
                .scoreMode(FunctionScoreMode.Multiply)
                .boostMode(FunctionBoostMode.Multiply)
        );

        SearchRequest.Builder searchRequestBuilder = new SearchRequest.Builder();
        searchRequestBuilder.index(esIndexProperties.getNoteIndexRead())
                .query(query -> query.functionScore(functionScoreQuery))
                .size(request.getSize());

        // ES查询
        SearchRequest searchRequest = searchRequestBuilder.build();
        log.info("notePageSearch query:{}", searchRequest.toString());
        SearchResponse<NoteIndex> searchResponse = esUtil.queryDocument(searchRequest, NoteIndex.class);
        searchResponse.hits().hits().forEach(hit -> {
            if (Objects.nonNull(hit.source())) {
                // 业务处理
            }
        });

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值