首页 > 其他分享 >ES推荐搜索、自动补全,并且springBoot集成

ES推荐搜索、自动补全,并且springBoot集成

时间:2024-10-17 16:21:41浏览次数:10  
标签:completion search name suggest springBoot prefix 搜索 ES 补全

推荐搜索

在搜索过程中,因为单词的拼写错误,没有得到任何的结果,希望ES能够给我们一个推荐搜索。

GET movies/_search
{
   "suggest": {
       # title_suggestion为我们自定义的名字
       "title_suggestion": {
                  "text": "drema",
                  "term": {
                     "field": "title",
                      "suggest_mode": "popular"
                      }
        }
   }
}

suggest_mode,有三个值:popular、missing、always

1. popular 是推荐词频更高的一些搜索。

2. missing 是当没有要搜索的结果的时候才推荐。

3. always无论什么情况下都进行推荐。

自动补全

自动补全应该是我们在日常的开发过程中最常见的搜索方式了,如百度搜索和京东商品搜索。

自动补全的功能对性能的要求极高,用户每发送输入一个字符就要发送一个请求去查找匹配项。

ES采取了不同的数据结构来实现,并不是通过倒排索引来实现的;需要将对应的数据类型设置为

completion ; 所以在将数据索引进ES之前需要先定义 mapping 信息。

1.定义mapping

PUT /test-completion
{
  "mappings": {
    "properties": {
     "name": {
       "type": "completion",
       "analyzer": "ik_smart"
     }
   }
  }
}

添加数据

POST test-completion/_bulk
{"index": {}}
{"name": "刘德华"}
{"index": {}}
{"name": "张学友"}
{"index": {}}
{"name": "柳岩"}
{"index": {}}
{"name": "柳菲菲"}
{"index": {}}
{"name": "刘备"}

2.前缀搜索

GET test-completion/_search
{
      "suggest": {
          "prefix_suggestion": {
              "prefix": "刘",
              "completion": {
                    "field": "name",
                    "skip_duplicates": true,
                    "size": 10
               }
          }
       }
}


GET test-completion/_search
{
      "suggest": {
          "prefix_suggestion": {
              "prefix": "刘德",
              "completion": {
                    "field": "name",
                    "skip_duplicates": true,
                    "size": 10
               }
          }
       }
}

3.同一个字段可能既是搜索字段又是补全,则可以建立子字段

PUT /test-completion1
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "ik_smart",
        "fields": { 
          "nameCompletion": {
            "type": "completion"
          }
        }
      }
    }
  }
}

查询

GET test-completion1/_search
{
      "suggest": {
          "prefix_suggestion": {
              "prefix": "刘",
              "completion": {
                    "field": "name.nameCompletion",
                    "skip_duplicates": true,
                    "size": 10
               }
          }
       }
}

结果

springboot集成实现自动补全

 @Autowired
    private ElasticsearchClient client;

    public List<String> suggest(String title) throws IOException {
        List<String> result = new ArrayList<>();
        //构建FiledSuggestMap
        Map<String,FieldSuggester> filedSuggestMap = new HashMap<>();
        FieldSuggester nameFiledSuggest = FieldSuggester.of(f -> f.prefix(title).completion(c -> c.field("name.nameCompletion")
                .skipDuplicates(true).size(10)));
        filedSuggestMap.put("pre_suggest",nameFiledSuggest);

        //构建SearchRequest
        SearchRequest searchRequest = SearchRequest.of(s -> s.index("suggest")
                .suggest(s1 -> s1.suggesters(filedSuggestMap)));
        SearchResponse<Object> search = client.search(searchRequest, Object.class);
        Map<String, List<Suggestion<Object>>> suggest = search.suggest();
        if (CollectionUtils.isEmpty(suggest)){
            return result;
        }
        List<CompletionSuggestOption<Object>> preSuggest = search.suggest()
                .get("pre_suggest").get(0)
                .completion()
                .options();
        for (CompletionSuggestOption<Object> suggestOption : preSuggest) {
            result.add(suggestOption.text());
        }
        return result;
    }

标签:completion,search,name,suggest,springBoot,prefix,搜索,ES,补全
From: https://blog.csdn.net/m0_73363097/article/details/143022067

相关文章

  • C#使用Kubernetes (k8s)
    在C#中使用Kubernetes(k8s)通常通过官方的Kubernetes.NET客户端与KubernetesAPI进行交互。以下是如何在C#中使用Kubernetes的简要指南。1.安装Kubernetes.NET客户端首先,在你的项目中安装官方的Kubernetes客户端库:使用NuGet安装:dotnetaddpackageKubernetesClient......
  • 关于 KubeSphere IDOR 安全漏洞 CVE-2024-46528 的声明及解决方案
    近期,有第三方平台的安全技术人员发现了在KubeSphere开源版3.4.1及4.1.1上存在不安全的直接对象引用(IDOR)的漏洞,该漏洞允许低权限的通过认证的攻击者在没有适当授权检查的情况下访问敏感资源。我们及时与对方进行了联系,并帮助对方解决了此问题,CVE漏洞的详细信息及问题处理过......
  • The 2024 CCPC National Invitational Contest (Northeast) ADEJ
    The2024CCPCNationalInvitationalContest(Northeast)ADEJA.PaperWatering思路:有两种类型的操作,对一个数开根号或平方。平方没有什么问题,开根号由于是向下取整再平方就会产生不一样的数。那么做法也很简单了。对于一个数\(x\),\(k\)步,首先它能平方往后变\(k\)步,往前能......
  • CMSC Manual testing Completeness SNU Score
    Homework#3Due:Friday,October18that4:00pmCSTTableofContentsHomework#3GettingstartedManualtestingCompletenessSNUScoreCodeQualitySubmissionThepurposeofthisassignmentistogiveyouexperiencewithconditionals,lists,andloops.......
  • java毕业设计-基于Springboot的教学资源共享平台【代码+论文+PPT】
    全文内容包括:1、采用技术;2、系统功能;3、系统截图;4、部分代码;5、配套内容。索取方式见文末微信号,欢迎关注收藏!一、采用技术语言:Java1.8框架:Springboot数据库:MySQL5.7、8.0开发工具:IntelliJIDEA旗舰版其他:Maven3.8以上二、系统功能成绩管理:记录和追踪学生课程成绩,便于......
  • Chinese-LLaMA-Alpaca-2: 新一代开源中文大语言模型
    Chinese-LLaMA-Alpaca-2:新一代开源中文大语言模型近日,由哈尔滨工业大学讯飞联合实验室推出的Chinese-LLaMA-Alpaca-2项目引起了广泛关注。该项目是中文LLaMA&Alpaca大模型的第二期,基于Meta发布的可商用大模型Llama-2进行开发,推出了一系列全新的中文大语言模型。本文将对这个......
  • 白鲸开源 WhaleStudio 入选「OSCAR 开源尖峰商业化」案例
    2024年10月16日,由中国通信标准化协会主办、中国信息通信研究院承办的“2024OSCAR开源产业大会”在北京成功举办。工业和信息化部信息技术发展司软件产业处处长李琰、中国信息通信研究院党委副书记王晓丽、中国通信标准化协会副理事长兼秘书长代晓慧出席并发表致辞。人民日报出版......
  • 洛谷题单指南-字符串-P2922 [USACO08DEC] Secret Message G
    原题链接:https://www.luogu.com.cn/problem/P2922题意解读:已知M个01串,给出N个01串,对于N个串的每一个,求在M个串中有多少与其有公共前缀,且前缀长度是两个串中较小者。解题思路:用Trie树存储M个01串,用cnt1[]记录某个节点结束的01串个数,cnt2[]记录经过某个节点的01串的数量对于N个0......
  • Codeforces Beta Round 93 (Div. 1 Only) B. Password 一题三吃
    https://codeforces.com/problemset/problem/126/B学完Z函数,先用哈希做了一遍,再用Z函数做了一遍,然后搜其他人的题解发现用next数组也能做,就又做了一遍B.Password题意给一串字符串\(s\),要求找一个最长的\(t\)\(t\)既是\(s\)的前缀串,也是后缀串,还是除了前缀后缀外的一个......
  • vue入门案例-基本使用----非常适合初学者。言简意赅,没有废话。附带springboot+vue前后
    Listitemvue1.vue介绍渐进式JavaScript框架,易学易用,性能出色,适用场景丰富的Web前端框架地址:https://cn.vuejs.org/什么是vue?Vue(发音为/vjuː/,类似view)是一款用于构建用户界面的JavaScript框架。它基于标准HTML、CSS和JavaScript构建,并提供了一套声明......