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

目录

一、查询语句

二、Java代码实现


基础介绍:

ES自定义评分机制:function_score查询详解-阿里云开发者社区ES自定义评分机制:function_score查询详解https://developer.aliyun.com/article/1054571

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

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

一、查询语句

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

二、Java代码实现

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

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())) {
                // 业务处理
            }
        });
相关推荐
数据与人工智能律师3 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
fatesunlove3 小时前
知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑
搜索引擎·ai·知识图谱
小生凡一4 小时前
搜索引擎工作原理|倒排索引|query改写|CTR点击率预估|爬虫
爬虫·搜索引擎
一只专注api接口开发的技术猿4 小时前
企业级电商数据对接:1688 商品详情 API 接口开发与优化实践
大数据·前端·爬虫
今天我又学废了6 小时前
Spark,SparkSQL操作Mysql, 创建数据库和表
大数据·mysql·spark
杰克逊的日记8 小时前
Flink运维要点
大数据·运维·flink
markuszhang11 小时前
Elasticsearch 官网阅读之 Term-level Queries
大数据·elasticsearch·搜索引擎
帝锦_li11 小时前
ElasticSearch
elasticsearch·搜索引擎
Hello World......12 小时前
Java求职面试:从核心技术到大数据与AI的场景应用
大数据·java面试·技术栈·互联网大厂·ai服务
python算法(魔法师版)14 小时前
.NET NativeAOT 指南
java·大数据·linux·jvm·.net