es的自动补全查询——DSL语句java代码实现

news2024/9/21 1:25:08

 1、DSL语句

elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。

为了提高补全查询的效率,对于文档中字段的类型有一些约束:

  • 参与补全查询的字段必须是completion类型。

  • 字段的内容一般是用来补全的多个词条形成的数组。

查询的DSL语句如下:

// 自动补全查询
GET /test/_search
{
  "suggest": {//表示是自动补全查询,固定写法
    "title_suggest": {//给查询起的名字,自定义
      "text": "s", // 关键字,查询s开头的数据
      "completion": {
        "field": "title", // 补全查询的字段,在哪个字段查询
        "skip_duplicates": true, // 跳过重复的
        "size": 10 // 获取前10条结果
      }
    }
  }
}

2、java实现

步骤:

1.确认索引库结构和使用的分词器,建议:创建倒排索引时,使用ik和拼音分词器,查询时使用ik分词器

示例:

// 酒店数据索引库
PUT /hotel
{
  "settings": {
    "analysis": {
      "analyzer": {
        "text_anlyzer": {
          "tokenizer": "ik_max_word",
          "filter": "py"
        },
        "completion_analyzer": {
          "tokenizer": "keyword",
          "filter": "py"
        }
      },
      "filter": {
        "py": {
          "type": "pinyin",
          "keep_full_pinyin": false,
          "keep_joined_full_pinyin": true,
          "keep_original": true,
          "limit_first_letter_length": 16,
          "remove_duplicated_term": true,
          "none_chinese_pinyin_tokenize": false
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id":{
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "text_anlyzer",
        "search_analyzer": "ik_smart",
        "copy_to": "all"
      },
      "address":{
        "type": "keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "score":{
        "type": "integer"
      },
      "brand":{
        "type": "keyword",
        "copy_to": "all"
      },
      "city":{
        "type": "keyword"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword",
        "copy_to": "all"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "text_anlyzer",
        "search_analyzer": "ik_smart"
      },
      "suggestion":{
          "type": "completion",
          "analyzer": "completion_analyzer",
          "search_analyzer": "keyword"
      }
    }
  }
}

2.索引库添加一个新字段suggestion,类型为completion类型

3.在对应的实体类中添加suggestion字段

4.代码实现

自动补全查询的DSL对应的JavaAPI

 自动补全的结果的DSL对应的JavaAPI

 根据前端的请求,完善controller层接口:

@GetMapping("suggestion")
public List<String> getSuggestions(@RequestParam("key") String prefix) {
    return hotelService.getSuggestions(prefix);
}

service层:

List<String> getSuggestions(String prefix);

serviceimpl层:

@Override
public List<String> getSuggestions(String prefix) {
    try {
        // 1.准备Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.准备DSL
        request.source().suggest(new SuggestBuilder().addSuggestion(
            "suggestions",// 查询的名称,自定义
            SuggestBuilders.completionSuggestion("suggestion")//自动补全的字段名
            .prefix("北京")//关键字,查询以北京开头的数据
            .skipDuplicates(true)// 跳过重复词条
            .size(10)//显示的词条数量
        ));
        // 3.发起请求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析结果
        Suggest suggest = response.getSuggest();
        // 4.1.根据补全查询名称,获取补全结果
        CompletionSuggestion suggestions = suggest.getSuggestion("suggestions");
        // 4.2.获取options
        List<CompletionSuggestion.Entry.Option> options = suggestions.getOptions();
        // 4.3.遍历
        List<String> list = new ArrayList<>(options.size());
        for (CompletionSuggestion.Entry.Option option : options) {
            String text = option.getText().toString();
            list.add(text);
        }
        return list;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC的执行流程

文章目录1 初始化阶段2 匹配阶段3 执行阶段我们把整个流程分成三个阶段初始化阶段匹配阶段执行阶段 1 初始化阶段 在 Web 容器第一次用到 DispatcherServlet 的时候&#xff0c;会创建其对象并执行 init 方法 init 方法内会创建 Spring Web 容器&#xff0c;并调用容器 refre…

阿里十年技术沉淀|深度解析百PB级数据总线技术

云原生场景下数据总线需求场景及挑战 数据总线简介 数据总线作为大数据架构下的流量中枢&#xff0c;在不同的大数据组件之间承载着数据桥梁的作用。通过数据总线&#xff0c;可以实时接入来自服务器、K8s、APP、Web、IoT/移动端等产生的各类异构数据&#xff0c;进行统一数据…

【java 新特性】java8新特性

核心内容 lambda 函数编程 在Java世界里面&#xff0c;面向对象还是主流思想&#xff0c;对于习惯了面向对象编程的开发者来说&#xff0c;抽象的概念并不陌生。面向对象编程是对数据进行抽象&#xff0c;而函数式编程是对行为进行抽象。现实世界中&#xff0c;数据和行为并…

【机器学习实战】使用SGD、随机森林对MNIST数据集实现多分类(jupyterbook)

1. 获取数据集并重新划分数据集 # 获取MNIST数据集 from sklearn.datasets import fetch_openml mnist fetch_openml(mnist_784, version1, cacheTrue, as_frameFalse)# 查看测试器和标签 X, y mnist[data], mnist[target] X_train, X_test, y_train, y_test X[:60000], X[…

Nuxt3使用echart,使用中国地图

目录 第一步安装echart 第二步配置plugins 第三步使用 例如使用饼状图 例如使用中国地图 第一步安装echart npm install echarts --save 第二步配置plugins 在plugins创建echarts.ts文件并写入下面内容 import * as echarts from echartsexport default defineNuxtPlugin((…

springboot事件监听机制二:基本工作原理

前言 这是继《springboot事件监听机制一&#xff1a;实战应用》第二篇&#xff0c;知其然&#xff0c;当然还要知其所以然&#xff0c;深入的源码里面探寻一下这一有套机制的工作原理。spring生态很茂盛&#xff0c;这里不会站太高去分析这个问题&#xff0c;大扯spring的一些原…

优秀的项目跟踪管理软件有哪些?

国内外优秀的项目跟踪管理软件有&#xff1a;1、软件项目跟踪管理PingCode&#xff1b;2、通用项目跟踪管理Worktile&#xff1b;3、小型团队项目跟踪管理Asana&#xff1b;4、基于桌面的项目跟踪软件Microsoft Project&#xff1b;5、适用所有类型项目的跟踪软件Clickup&#…

[ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2018-16509

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Cellobiose-PEG-DBCO 纤维二糖-聚乙二醇-二苯基环辛炔,DBCO-PEG-纤维二糖

Cellobiose-PEG-DBCO 纤维二糖-聚乙二醇-二苯基环辛炔&#xff0c;DBCO-PEG-纤维二糖 中文名称&#xff1a;纤维二糖-二苯基环辛炔 英文名称&#xff1a;Cellobiose-DBCO 别称&#xff1a;二苯基环辛炔修饰纤维二糖&#xff0c;二苯基环辛炔-纤维二糖 PEG分子量可选&…

2023年湖北安全员ABC报名时间和考试时间是什么时候?甘建二

2023年湖北安全员ABC报名时间和考试时间是什么时候&#xff1f; 安全员ABC考试和报名时间&#xff0c;12月份安全员ABC考试时间是12月底&#xff0c;12月份湖北安全员ABC报名是现在开始报名了&#xff0c;目前报名入口已经开通需要开始报名了。 2023年湖北安全员ABC报名时间&am…

人工智能历史上的重要一步:ChatGPT影响到谷歌地位?

AI神器ChatGPT 火了。 能直接生成代码、会自动修复bug、在线问诊、模仿莎士比亚风格写作……各种话题都能hold住&#xff0c;它就是OpenAI刚刚推出的——ChatGPT。 有脑洞大开的网友甚至用它来设计游戏&#xff1a;先用ChatGPT生成游戏设定&#xff0c;再用Midjourney出图&…

如何让 useEffect 支持 async/await?

大家在使用 useEffect 的时候&#xff0c;假如回调函数中使用 async...await... 的时候&#xff0c;会报错如下。 看报错&#xff0c;我们知道 effect function 应该返回一个销毁函数&#xff08;return返回的 cleanup 函数&#xff09;&#xff0c;如果 useEffect 第一个参数传…

[毕业设计]C++程序类内聚度的计算与存储

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

651页23万字智慧教育大数据信息化顶层设计及智慧应用建设方案

目录 一、 方案背景 1.1 以教育现代化支撑国家现代化 1.2 教育信息化是教育现代化重要内容和标志 1.3 大数据驱动教育信息化发展 1.4 政策指导大数据推动教育变革 1.5 教育大数据应用生态服务教育现代化 二、 建设需求 2.1 地区教育系统亟待进行信息共享、系统融合 2.2…

L2正则线性回归(岭回归)

岭回归 数据的特征比样本点还多&#xff0c;非满秩矩阵在求逆时会出现问题 岭回归即我们所说的L2正则线性回归&#xff0c;在一般的线性回归最小化均方误差的基础上增加了一个参数w的L2范数的罚项&#xff0c;从而最小化罚项残差平方和 简单说来&#xff0c;岭回归就是在普通…

FreeRTOS基础知识

目录 1.任务调度器简介 1.1抢占式调度举例 1.2时间片调度举例 2.任务状态 3.总结 1.任务调度器简介 调度器就是使用相关的调度算法来决定当前需要执行哪个任务。 FreeRTOS一共支持以下三种任务调度方式&#xff1a; FreeRTOS调度方式抢占式调度主要是针对优先级不同的任务…

vector深度剖析及模拟实现

vector模拟实现&#x1f3de;️1. vector的扩容机制&#x1f301;2. vector迭代器失效问题&#x1f4d6;2.1 insert导致的失效&#x1f4d6;2.2 erase导致的失效&#x1f33f;3. vector拷贝问题&#x1f3dc;️4. 模拟实现vector&#x1f3de;️1. vector的扩容机制 #include&…

SQL快速入门、查询(SqlServer)[郝斌SqlServer完整版]

文章目录SQL学前导图一 、基本信息1 相关名词数据库相关基本概念&#xff1a;字段、属性、记录(元祖)、表、主键、外键2 基本语句3 约束&#xff1a;主键约束、外键约束、check约束、default约束、唯一约束二、查询1 计算列2 distinct&#xff08;去重&#xff09;3 between4 i…

生产跟踪是生产控制的基础,其主要功能有哪些?

生产跟踪是生产控制的基础&#xff0c;只有对生产的过程全面了解&#xff0c;才能掌握和控制生产的执行情况&#xff0c;所以生产跟踪模块在制造执行系统中一种起着举足轻重的作用。生产跟踪&#xff0c;不单单是对生产过程进行监控和记录数据&#xff0c;还需要将各个生产环节…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园新闻发布管理系统574ec

面对老师五花八门的设计要求&#xff0c;首先自己要明确好自己的题目方向&#xff0c;并且与老师多多沟通&#xff0c;用什么编程语言&#xff0c;使用到什么数据库&#xff0c;确定好了&#xff0c;在开始着手毕业设计。 1&#xff1a;选择课题的第一选择就是尽量选择指导老师…