当前位置: 首页 > article >正文

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

推荐搜索

在搜索过程中,因为单词的拼写错误,没有得到任何的结果,希望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;
    }

http://www.kler.cn/news/363451.html

相关文章:

  • 矩阵基础知识
  • 短剧AI突围战,百度跑偏了
  • 【软件系统架构设计师-案例-3】设计模式
  • 凹凸性和拐点的概念
  • Linux系统基础-进程间通信(5)_模拟实现命名管道和共享内存
  • visual studio设置修改文件字符集方法
  • 1024,说点什么
  • 顶层const与底层const的区别
  • 【哲学和历史】-1《西方现代思想史》读书笔记
  • 在线教育(培训+考试)/企业培训-企业培训平台-企业培训系统-企业内部培训系统-企业考试系统+Java语言开发
  • LeetCode 每周算法 9(动态规划)
  • 【C#】中文分词
  • 【LLaMA-Facrory】【模型评估】:代码能力评估——Qwen-Coder-7B 和 deepseek-coder-7b-base-v1.5
  • JavaWeb合集03-Maven
  • 九盾叉车高位显示器:重塑叉车视界,引领高位精准
  • 关于bp抓不到本地包
  • 数据结构编程实践20讲(Python版)—19字典树
  • CompletableFuture详解、什么是CompletableFuture类,怎么在java并发编程、多线程中使用(结合案例,保姆级教程))
  • 后端技术:有哪些常见的应用场景?
  • docker 发布镜像
  • springboot汉妆养生会馆网站-计算机毕业设计源码96229
  • 基于K8S的StatefulSet部署mysql主从
  • QGIS之三十二DEM地形导出三维模型gltf
  • 《嵌入式系统设计工程师-中级(Linux)》认证证书含金量如何?怎么考?
  • JavaScript 第24章:React 基础
  • Javascript算法(滑块窗口、螺旋矩阵)