【elasticsearch】搜索结果处理

搜索结果处理

排序

elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

GET /indexName/_search
{
	"query":{
		"match_all":{}
	},
	"sort":[
		{
			"FIELD":"desc" //排序字段和排序方式ASC、DESC  升序、降序
		}
	]
}
GET /indexName/_search
{
	"query":{
		"match_all":{}
	},
	"sort":[
		{
			"_geo_distance":{
                "FIELD":"纬度,经度",
                "order":"asc",
                "unit":"km"  //单位
            }
		}
	]
}

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "score": {
        "order": "desc"
      },
      "price": {
        "order": "asc"
      }
    }
  ]
}

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
          "lat": 31,
          "lon": 121
        },
        "order": "asc",
        "unit": "km"
      }
    }
  ]
}

分页

elasticsearch默认情况下只返回top10的数据。而如果要查询更多的数据就需要修改分页参数了。

elasticsearch中通过修改from、size参数来控制要返回的分页结果

GET /hotel/_search
{
	"query":{
		"match_all":{}
	},
	"from":990, //分页开始的位置,默认为0
	"size":10, //期望获取的文档总数
	"sort":[
		{
			"price":"asc"
		}
	]
}
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price":"asc"
    }
  ],
  "from": 0,
  "size": 20
}

深度分页问题

ES是分布式的,所以会面临深度分页问题。例如price排序后,获取from=990,size=10的数据:

高亮处理

高亮:就是在搜索结果中把搜索关键字突出显示。

GET /hotel/_search
{
	"query":{
		"match":{
			"FIELD":"TEXT"  //不能为match_all{} 因为高亮一定是对某个字段进行高亮
		}
	},
	"highlight":{
		"fields":{    //高亮的字段不止一个
			"FIELD":{
				"pre_tags":"<em>", //用于标记高亮字段的前置标签
				"post_tags":"</em>" //用于标记高亮字段的后置标签
			}
		}
	}
}
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家"
    }
  },
  "highlight": {
    "fields": {
      "name": {
        "require_field_match": "false",
        "pre_tags": "<em>",
        "post_tags": "</em>"
      }
    }
  }
}

RestClient查询文档

match_all

    void testMatchAll() throws IOException {
        //1.准备Request
        SearchRequest request=new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse search = client.search(request, RequestOptions.DEFAULT);
        System.out.println(search);
    }

    void testMatchAll() throws IOException {
        //1.准备Request
        SearchRequest request=new SearchRequest("hotel");
        //2.准备DSL
        request.source().query(QueryBuilders.matchAllQuery());
        //3.发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        //解析结果
        SearchHits hits = response.getHits();
        //查询的总条数
        long total = hits.getTotalHits().value;
        System.out.println("一共搜索到 "+total+"数据");
        //查询hit数组
        SearchHit[] hits1 = hits.getHits();
        //遍历hit数组
        for(SearchHit hit : hits1){
            //得到source
            String json=hit.getSourceAsString();
            //反序列化
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            //打印
            System.out.println(hotelDoc);
            System.out.println();
        }
    }

全文检索查询

全文检索的match和multi_match查询与match_all的API基本一致。差别是查询条件,也就是query部分。

multi_match:对多个字段进行查询。

    void testMulMatchAll() throws IOException {
        //创建request
        SearchRequest request=new SearchRequest("hotel");
        //准备DSL
        SearchSourceBuilder query = request.source().query(QueryBuilders.matchQuery("all", "如家"));
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("搜索到的数据一共有:"+totalHits+"条");
        SearchHit[] hits1 = hits.getHits();
        for(SearchHit hit : hits1){
            String json = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
            System.out.println();
        }
    }
    void testMulMatchAll1() throws IOException {
        //创建request
        SearchRequest request=new SearchRequest("hotel");
        //准备DSL
        SearchSourceBuilder query = request.source().query(QueryBuilders.multiMatchQuery("如家","brand","name","business"));
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("搜索到的数据一共有:"+totalHits+"条");
        SearchHit[] hits1 = hits.getHits();
        for(SearchHit hit : hits1){
            String json = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
            System.out.println();
        }
    }

精确查询

    void BooleanMatch() throws IOException {
        //1.准备Request
        SearchRequest request=new SearchRequest("hotel");
        //准备DSL
        //准备BooleanQuery
        BoolQueryBuilder boolQuery=QueryBuilders.boolQuery();
        //添加term
        boolQuery.must(QueryBuilders.termQuery("city","北京"));
        boolQuery.filter(QueryBuilders.rangeQuery("price").lte(250));
        request.source().query(boolQuery);
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("搜索到的数据一共有:"+totalHits+"条");
        SearchHit[] hits1 = hits.getHits();
        for(SearchHit hit : hits1){
            String json = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
            System.out.println();
        }
    }

排序和分页

    void PageTest() throws IOException {
        //1.准备Request
        SearchRequest request=new SearchRequest("hotel");
        //准备DSL
       //准备query
        request.source().query(QueryBuilders.matchAllQuery());
        //排序
        request.source().sort("price", SortOrder.ASC);
        //分页
        request.source().from(0).size(5);
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("搜索到的数据一共有:"+totalHits+"条");
        SearchHit[] hits1 = hits.getHits();
        for(SearchHit hit : hits1){
            String json = hit.getSourceAsString();
            HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
            System.out.println(hotelDoc);
            System.out.println();
        }
    }

高亮

void HighLightTest() throws IOException {
    //1.准备Request
    SearchRequest request=new SearchRequest("hotel");
    //准备DSL
    //准备query
    request.source().query(QueryBuilders.matchQuery("all","如家"));
    //高亮
    request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
    //发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    TotalHits totalHits = hits.getTotalHits();
    System.out.println("搜索到的数据一共有:"+totalHits+"条");
    SearchHit[] hits1 = hits.getHits();
    for(SearchHit hit : hits1){
        String json = hit.getSourceAsString();
        HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
        System.out.println(hotelDoc);
        System.out.println();
    }
}

但是为什么没有出现高亮呢?

    void HighLightTest1() throws IOException {
        //1.准备Request
        SearchRequest request=new SearchRequest("hotel");
        //准备DSL
        //准备query
        request.source().query(QueryBuilders.matchQuery("all","如家"));
        //高亮
        request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
        //发送请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        SearchHits hits = response.getHits();
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("搜索到的数据一共有:"+totalHits+"条");
        SearchHit[] hits1 = hits.getHits();
        for(SearchHit hit : hits1){
            //获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            //根据字段名获取高亮结果
            HighlightField highlightField = highlightFields.get("name");
            if(highlightField!=null){
                //获取高亮值
                String string = highlightField.getFragments()[0].string();
                System.out.println(string);
            }
        }
    }

加粗样式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/409144.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java 内存模型

程序计数器 线程私有主要字节码解释器通过读取程序计数器来选取下一条需要执行的指令&#xff0c;比如分支&#xff0c;循环&#xff0c;跳转和异常处理如果执行的是java 方法&#xff0c;那么程序计数器记录的时候虚拟机字节码指令的地址&#xff0c;如果执行的是native 方法…

【FreeRTOS】任务管理

一、任务管理介绍 1.任务状态 1&#xff09;调度器切换任务调度 2&#xff09;任务是一个死循环&#xff0c;如果想要停止这个任务则会调用在函数最后写的delete函数进行自杀 1.就绪态 1&#xff09;已经具备执行的能力&#xff0c;只等待调度器进行调度。 2&#xff09;新创建…

Linux系统前后端分离项目

目录 一.jdk安装 二.tomcat安装 三.MySQL安装 四.nginx安装 五.Nginx负载均衡tomcat 六.前端部署 一.jdk安装 1. 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2. 解压安装包 这里需要解压到usr/local目录下&#xff0c;在这里新建一个…

python程序设计基础:异常处理结构与程序调试、测试

第八章&#xff1a;异常处理结构与程序调试、测试 简单地说,异常是指程序运行时引发的错误,引发错误的原因有很多例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。 如果这些错误得不到正确的处理将会导致程序终止运行,而合理…

HuggingFists系统功能介绍(1)--系统概述

HuggingFists是一款低代码AI应用工具&#xff0c;力图发展为LangChain的低代码平替工具。HuggingFists发起于数由科技的Sengee数据科学计算框架&#xff0c;因此其界面风格继承了数据科学工具的很多特征。有别于完全基于LangChain衍生出的低代码工具Flowise&#xff0c;其风格更…

YOLO如何训练自己的模型

目录 步骤 一、打标签 二、数据集 三、跑train代码出模型 四、跑detect代码出结果 五、详细操作 步骤 一、打标签 &#xff08;1&#xff09;在终端 pip install labelimg &#xff08;2&#xff09;在终端输入labelimg打开 如何打标签&#xff1a; 推荐文章&#xf…

2.23 Day05

#include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget) {ui->setupUi(this);//居中ui->label02->setAlignment(Qt::AlignCenter);ui->Edit1->setAlignment(Qt::Alig…

协程源码 launch 流程跟踪学习

为了更深入学习协程的底层实现原理&#xff0c;了解协程线程切换的根本本质。也为了以后在工作中可以根据不同的需求场景&#xff0c;更加随心所欲的使用不同的协程。 今天通过 launch 跟踪一下协程的执行流程。 fun getData() {Trace.beginSection("getData");Log.…

knife4j springboot3使用

简介 在日常开发中&#xff0c;写接口文档是我们必不可少的&#xff0c;而Knife4j就是一个接口文档工具&#xff0c;可以看作是Swagger的升级版&#xff0c;但是界面比Swagger更好看&#xff0c;功能更丰富 使用 我使用的是springboot3.2.3 knife4j 4.3.0,knife4j 4.4版本有…

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:主设备和次设备

🚀返回专栏总目录 文章目录 一、主设备和次设备的概念二、设备号的分配和释放沉淀、分享、成长,让自己和他人都能有所收获!😄 字符设备通过字符(一个接一个的字符)以流方式向用户程序传递数据,就像串行端口那样。字符设备驱动通过/dev目录下的特殊文件公开设备的属性和…

dolphinscheduler单机版部署教程

文章目录 前言一、安装准备1. 安装条件2. 安装jdk3. 安装MySQL 二、安装dolphinscheduler1. 下载并解压dolphinscheduler2. 修改配置文件2.1 修改 dolphinscheduler_env.sh 文件2.2 修改 application.yaml 文件 3. 配置mysql数据源3.1 修改MySQL安全策略3.2 查看数据库3.3 创建…

UE5 文字游戏(1) 仅UI截图转换为texture2d(适用于window端)

目录 需求 思路 1.截图并读取到本地 2.本地读取图片并转换为纹理2d 效果展示 找了好多的解决办法&#xff0c;都不管用。这个算是折中的。 需求 将当前的用户控件&#xff08;ui&#xff09;截图下来&#xff0c;并赋值到一个texture2d上。 我的需求&#xff1a;文字游戏…

golang通过http访问外部网址

不同项目之前,通过http访问,进行数据沟通 先设定一个接口,确认外部能访问到 PHP写一个接口 public function ceshi_return() {$data $this->request->param();$id $data[id];$res Db::name(user)->field(id,status,price,name)->where([id>$id])->find…

抖音视频抓取软件的优势|视频评论内容提取器|批量视频下载

抖音视频抓取软件在市场上的优势明显&#xff1a; 功能强大&#xff1a;我们的软件支持关键词搜索抓取和分享链接单一视频提取两种方式&#xff0c;满足用户不同的需求。同时&#xff0c;支持批量处理数据&#xff0c;提高用户获取视频的效率。 操作简单&#xff1a;我们的软件…

matlab|计及源荷不确定性的综合能源生产单元运行调度与容量配置随机优化模型

目录 1 主要内容 1.1 风光场景聚类 1.2 主模型程序结果 1.3 随机模型和确定性模型对比 1.4 有无储气对比 1.5 煤价灵敏性分析 1.6 甲烷价格灵敏性分析 2 部分程序 3 下载链接 1 主要内容 本程序复现《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机…

OpenGL ES (OpenGL) Compute Shader 计算着色器是怎么用的?

OpenGL ES (OpenGL) Compute Shader 是怎么用的? Compute Shader 是 OpenGL ES(以及 OpenGL )中的一种 Shader 程序类型,用于在GPU上执行通用计算任务。与传统的顶点着色器和片段着色器不同,Compute Shader 被设计用于在 GPU 上执行各种通用计算任务,而不是仅仅处理图形…

前端导出下载文件后提示无法打开文件

问题 项目中的导出文件功能&#xff0c;导出下载后的文件打开提示如下&#xff1a; 原因 对返回的响应数据进行打印&#xff0c;发现响应数据为字符串格式&#xff0c;前期规划的后端返回数据应该 blob 对象的。后经排查后发现是请求头缺少了响应数据格式的配置&#xff0c;应…

SpringMVC 学习(六)之视图

目录 1 SpringMVC 视图介绍 2 JSP 视图 3 Thymeleaf 视图 4 FreeMarker 视图 5 XSLT 视图 6 请求转发与重定向 6.1 请求转发 (Forward) 6.2 重定向 (Redirect) 7 视图控制器 (view-controller) 1 SpringMVC 视图介绍 在 SpringMVC 框架中&#xff0c;视图可以是一个 J…

Python爬虫实战:图片爬取与保存

引言&#xff1a; 在本文中&#xff0c;我们将学习如何使用Python创建一个简单的图片爬虫。 我们将利用requests库来发送HTTP请求&#xff0c;BeautifulSoup库来解析HTML页面&#xff0c;以及os和shutil库来下载和保存图片。通过这个教程&#xff0c;你将学会如何爬取网…

神经网络2-卷积神经网络一文深度读懂

卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一类包含卷积计算且具有深度结构的前馈神经网络&#xff08;Feedforward Neural Networks&#xff09;&#xff0c;主要用于图像识别、语音识别和自然语言处理等任务&#xff0c;是深度学习&#xff0…