前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Elasticsearch使用:Suggester API(二)

Elasticsearch使用:Suggester API(二)

原创
作者头像
HLee
修改于 2021-01-26 02:34:11
修改于 2021-01-26 02:34:11
1.1K00
代码可运行
举报
文章被收录于专栏:房东的猫房东的猫
运行总次数:0
代码可运行

Mapping

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "indexName":"drug",
    "indexSource":{
        "settings":{
            "number_of_shards":1,
            "number_of_replicas":2,
            "index":{
                "analysis":{
                    "filter":{
                        "bigram_filter":{
                            "max_shingle_size":"2",
                            "min_shingle_size":"2",
                            "output_unigrams":"false",
                            "type":"shingle"
                        },
                        "trigram_filter":{
                            "max_shingle_size":"3",
                            "min_shingle_size":"2",
                            "type":"shingle"
                        },
                        "my_synonym":{
                            "type":"synonym",
                            "synonyms_path":"analysis/synonym.txt"
                        }
                    },
                    "analyzer":{
                        "trigram_analyzer":{
                            "filter":[
                                "lowercase",
                                "trigram_filter"
                            ],
                            "type":"custom",
                            "tokenizer":"standard"
                        },
                        "index_ansj_analyzer":{
                            "filter":[
                                "my_synonym",
                                "asciifolding"
                            ],
                            "type":"custom",
                            "tokenizer":"index_ansj"
                        },
                        "comma":{
                            "pattern":",",
                            "type":"pattern"
                        },
                        "lowercase_ngram_1_2":{
                            "filter":"lowercase",
                            "tokenizer":"ngram_1_2_tokenizer"
                        },
                        "bigram_analyzer":{
                            "filter":[
                                "lowercase",
                                "bigram_filter"
                            ],
                            "type":"custom",
                            "tokenizer":"standard"
                        },
                        "pinyin_analyzer":{
                            "tokenizer":"my_pinyin"
                        }
                    },
                    "tokenizer":{
                        "my_pinyin":{
                            "lowercase":"true",
                            "keep_original":"false",
                            "keep_first_letter":"true",
                            "keep_separate_first_letter":"true",
                            "type":"pinyin",
                            "limit_first_letter_length":"16",
                            "keep_full_pinyin":"true",
                            "keep_none_chinese_in_joined_full_pinyin":"true",
                            "keep_joined_full_pinyin":"true"
                        },
                        "ngram_1_2_tokenizer":{
                            "token_chars":[
                                "letter",
                                "digit"
                            ],
                            "min_gram":"1",
                            "type":"nGram",
                            "max_gram":"2"
                        }
                    }
                }
            }
        },
        "mappings":{
            "properties":{
                "categoryfirst":{
                    "type":"keyword"
                },
                "categorysecond":{
                    "type":"keyword"
                },
                "commonname":{
                    "type":"completion",
                    "analyzer":"trigram_analyzer",
                    "preserve_separators":true,
                    "preserve_position_increments":true,
                    "max_input_length":50,
                    "contexts":[
                        {
                            "type":"category",
                            "name":"spu_category"
                        }
                    ],
                    "fields":{
                        "ansj":{
                            "type":"text",
                            "analyzer":"index_ansj_analyzer"
                        },
                        "text":{
                            "type":"text"
                        },
                        "pinyincompletion":{
                            "type":"completion",
                            "analyzer":"pinyin_analyzer",
                            "preserve_separators":true,
                            "preserve_position_increments":true,
                            "search_analyzer":"simple",
                            "max_input_length":50
                        },
                        "keyword":{
                            "type":"keyword"
                        },
                        "pinyin":{
                            "type":"text",
                            "boost":10,
                            "term_vector":"with_offsets",
                            "analyzer":"pinyin_analyzer"
                        },
                        "shingle":{
                            "type":"text",
                            "analyzer":"trigram_analyzer"
                        }
                    }
                },
                "ctime":{
                    "type":"date",
                    "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                },
                "doctorteamhotid":{
                    "type":"keyword"
                },
                "drugid":{
                    "type":"keyword"
                },
                "drugname":{
                    "type":"completion",
                    "analyzer":"trigram_analyzer",
                    "preserve_separators":true,
                    "preserve_position_increments":true,
                    "max_input_length":50,
                    "contexts":[
                        {
                            "type":"category",
                            "name":"spu_category"
                        }
                    ],
                    "fields":{
                        "ansj":{
                            "type":"text",
                            "analyzer":"index_ansj_analyzer"
                        },
                        "text":{
                            "type":"text"
                        },
                        "pinyincompletion":{
                            "type":"completion",
                            "analyzer":"pinyin_analyzer",
                            "search_analyzer":"simple",
                            "preserve_separators":true,
                            "preserve_position_increments":true,
                            "max_input_length":50
                        },
                        "keyword":{
                            "type":"keyword"
                        },
                        "pinyin":{
                            "type":"text",
                            "boost":10,
                            "term_vector":"with_offsets",
                            "analyzer":"pinyin_analyzer"
                        },
                        "shingle":{
                            "type":"text",
                            "analyzer":"trigram_analyzer"
                        }
                    }
                },
                "drugtype":{
                    "type":"keyword"
                },
                "factoryname":{
                    "type":"text",
                    "fields":{
                        "ansj":{
                            "type":"text",
                            "analyzer":"index_ansj_analyzer"
                        },
                        "keyword":{
                            "type":"keyword"
                        },
                        "pinyin":{
                            "type":"text",
                            "boost":10,
                            "term_vector":"with_offsets",
                            "analyzer":"pinyin_analyzer"
                        },
                        "shingle":{
                            "type":"text",
                            "analyzer":"trigram_analyzer"
                        }
                    },
                    "copy_to":[
                        "text_all"
                    ]
                },
                "id":{
                    "type":"keyword"
                },
                "included":{
                    "type":"keyword"
                },
                "indextype":{
                    "type":"keyword"
                },
                "iscfda":{
                    "type":"keyword"
                },
                "medicineaccuratenum":{
                    "type":"keyword",
                    "copy_to":[
                        "text_all"
                    ]
                },
                "prescription":{
                    "type":"keyword"
                },
                "stock":{
                    "type":"long"
                },
                "relation":{
                    "type":"join",
                    "eager_global_ordinals":true,
                    "relations":{
                        "drug-spu":[
                            "drug-doctorteamhot",
                            "drug-sku"
                        ]
                    }
                },
                "text_all":{
                    "type":"text"
                },
                "utime":{
                    "type":"date",
                    "format":"yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
                }
            }
        }
    }
}

API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Map<String, List> termSuggestDrug(DrugSearchRequest searchRequest) {

    String keyword = searchRequest.getKeyword();

    SearchSourceBuilder builder = new SearchSourceBuilder();

    if (StringUtils.isNotBlank(keyword)) {
        SuggestionBuilder drugnameTermSuggestionBuilder = SuggestBuilders.termSuggestion("commonname.ansj")
                .text(keyword)
                .maxEdits(2)
                .minWordLength(2)
                .suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS)
                .prefixLength(2)
                .analyzer("simple")
                .size(10);
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion("termSuggest", drugnameTermSuggestionBuilder);
        builder.suggest(suggestBuilder);
    }

    log.info(SearchConst.BUILDER_DATA, builder);
    LocalLogger.builder("termSuggestDrug")
            .string1(builder.toString())
            .string2(gson.toJson(searchRequest))
            .string3(TraceHelper.getUniqueKey())
            .time1(new HaoDate())
            .info();

    SearchResponse result = searchDao.searchBySearchSourceBuilder(builder, INDEX_NAME);

    Map<String, List> resultResponse = Maps.newHashMap();

    List<Map<String,Object>> hits = Lists.newArrayList();
    if (null != result) {
        Iterator<SearchHit> iterator = result.getHits().iterator();
        while (iterator.hasNext()) {
            Map<String, Object> hit = new HashMap<>();
            SearchHit searchHit = iterator.next();

            hit.put("matches", searchHit.getSourceAsMap());
            hit.put("score", searchHit.getScore());

            hits.add(hit);
        }

        Suggest suggest = result.getSuggest();
        Iterator suggestionIterator = suggest.iterator();
        TermSuggestion termSuggestion;
        while (suggestionIterator.hasNext()) {
            termSuggestion = (TermSuggestion)suggestionIterator.next();
            List suggestions = Lists.newArrayList();
            String name = termSuggestion.getName();
            for (TermSuggestion.Entry entry : termSuggestion){
                for (TermSuggestion.Entry.Option option : entry){
                    Map<String, Object> optionMap = Maps.newHashMap();
                    String text = option.getText().string();
                    float score = option.getScore();

                    optionMap.put("text", text);
                    optionMap.put("score", score);

                    suggestions.add(optionMap);
                }
            }
            resultResponse.put(name, suggestions);
        }
    }
    resultResponse.put("hits", hits);
    return resultResponse;
}

public Map<String, List> phraseSuggestDrug(DrugSearchRequest searchRequest) {

    String keyword = searchRequest.getKeyword();

    SearchSourceBuilder builder = new SearchSourceBuilder();

    if (StringUtils.isNotBlank(keyword)) {
        PhraseSuggestionBuilder drugnameSuggestBuilder = SuggestBuilders.phraseSuggestion("commonname.ansj")
                .text(keyword)
                .highlight("<em>", "</em>")
                .maxErrors(2) // 最多可以拼错的 Terms 数
                .analyzer("simple")
                .confidence(0)
                .size(10);

        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion("phraseSuggest", drugnameSuggestBuilder);
        builder.suggest(suggestBuilder);
    }

    log.info(SearchConst.BUILDER_DATA, builder);
    LocalLogger.builder("phraseSuggestDrug")
            .string1(builder.toString())
            .string2(gson.toJson(searchRequest))
            .string3(TraceHelper.getUniqueKey())
            .time1(new HaoDate())
            .info();

    SearchResponse result = searchDao.searchBySearchSourceBuilder(builder, INDEX_NAME);

    Map<String, List> resultResponse = Maps.newHashMap();

    List<Map<String,Object>> hits = Lists.newArrayList();
    if (null != result) {

        Iterator<SearchHit> iterator = result.getHits().iterator();
        while (iterator.hasNext()) {
            Map<String, Object> hit = new HashMap<>();
            SearchHit searchHit = iterator.next();

            hit.put("matches", searchHit.getSourceAsMap());
            hit.put("score", searchHit.getScore());

            hits.add(hit);
        }

        Suggest suggest = result.getSuggest();
        Iterator suggestionIterator = suggest.iterator();
        PhraseSuggestion phraseSuggestion;
        while (suggestionIterator.hasNext()) {
            phraseSuggestion = (PhraseSuggestion)suggestionIterator.next();
            List suggestions = Lists.newArrayList();
            String name = phraseSuggestion.getName();
            for (PhraseSuggestion.Entry entry : phraseSuggestion){
                for (PhraseSuggestion.Entry.Option option : entry){
                    Map<String, Object> optionMap = Maps.newHashMap();
                    String text = option.getText().string();
                    float score = option.getScore();
                    String highlighted =  option.getHighlighted().string();

                    optionMap.put("text", text);
                    optionMap.put("score", score);
                    optionMap.put("highlighted", highlighted);

                    suggestions.add(optionMap);
                }
            }
            resultResponse.put(name, suggestions);
        }
    }
    resultResponse.put("hits", hits);
    return resultResponse;
}

public Set completionSuggestDrug(DrugSearchRequest searchRequest) {

    String keyword = searchRequest.getKeyword();
    String category = searchRequest.getCategory();

    SearchSourceBuilder builder = new SearchSourceBuilder();
    if (StringUtils.isNotBlank(keyword)) {

        CompletionSuggestionBuilder commonnameBuilder = SuggestBuilders.completionSuggestion("commonname")
                .prefix(keyword).skipDuplicates(true)
                .size(10);

        CompletionSuggestionBuilder drugnameBuilder = SuggestBuilders.completionSuggestion("drugname")
                .prefix(keyword).skipDuplicates(true)
                .size(10);
        SuggestionBuilder pinyinDrugnameBuilder = SuggestBuilders.completionSuggestion("drugname.pinyincompletion")
                .prefix(keyword).skipDuplicates(true)
                .size(10);
        SuggestionBuilder pinyinCommonnameBuilder = SuggestBuilders.completionSuggestion("commonname.pinyincompletion")
                .prefix(keyword).skipDuplicates(true)
                .size(10);

        if (StringUtils.isNotBlank(category)) {

            CategoryQueryContext context = CategoryQueryContext.builder()
                    .setBoost(1)
                    .setCategory(category)
                    .setPrefix(false).build();
            Map categoryMap = Maps.newHashMap();
            List categoryList = Lists.newArrayList();
            categoryList.add(context);
            categoryMap.put("spu_category", categoryList);

            commonnameBuilder.contexts(categoryMap);
            drugnameBuilder.contexts(categoryMap);
        }

        String[] source = {"commonname", "drugname"};
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion("commonname-completionsuggest", commonnameBuilder)
                .addSuggestion("drugname-completionsuggest", drugnameBuilder)
                .addSuggestion("pinyincommonvame-completionsuggest", pinyinCommonnameBuilder)
                .addSuggestion("pinyindrugname-completionsuggest", pinyinDrugnameBuilder);
        builder.suggest(suggestBuilder).fetchSource(source, null);
    }

    log.info(SearchConst.BUILDER_DATA, builder);
    LocalLogger.builder("completionSuggestDrug")
            .string1(builder.toString())
            .string2(gson.toJson(searchRequest))
            .string3(TraceHelper.getUniqueKey())
            .time1(new HaoDate())
            .info();

    SearchResponse result = searchDao.searchBySearchSourceBuilder(builder, INDEX_NAME);

    Set hits = Sets.newHashSet();
    if (null != result) {

        Suggest suggest = result.getSuggest();
        Iterator suggestionIterator = suggest.iterator();
        CompletionSuggestion completionSuggestion;
        while (suggestionIterator.hasNext()) {
            completionSuggestion = (CompletionSuggestion)suggestionIterator.next();
            for (CompletionSuggestion.Entry entry : completionSuggestion){
                for (CompletionSuggestion.Entry.Option option : entry){
                    String text = option.getText().string();

                    hits.add(text);
                }
            }
        }
    }
    return hits;
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Java后端开发你应该知道的全局异常处理
在开发Web应用程序时,异常处理是一项非常重要的任务。异常处理可以提高程序的健壮性和稳定性。Java后端开发人员可以设计一个统一的全局异常处理方案来解决异常处理的问题,避免代码冗余,提高开发效率。在本文中,我们将介绍如何设计Java后端的全局异常处理方案。
闻说社
2023/05/04
1.6K0
探索 Spring Boot 高级应(四)用:Thymeleaf、全局异常处理与 AOP
大家好,我是默语,一个专注于分享技术干货的博主。这篇博客将深入探讨Spring Boot的高级应用,涵盖Thymeleaf模板引擎的集成、全局异常处理以及AOP切面的实现。通过丰富的代码案例和详细的讲解,希望能够帮助大家全面掌握这些高级技术,提高项目的开发效率和代码质量。关键词包括Spring Boot集成Thymeleaf、全局异常处理、Spring Boot AOP等。
默 语
2024/11/20
1490
Spring | 如何在项目中优雅的处理异常 - 全局异常处理以及自定义异常处理
在快速迭代和持续交付的今天,软件的健壮性、可靠性和用户体验已经成为区别成功与否的关键因素。特别是在Spring框架中,由于其广泛的应用和丰富的功能,如何优雅地处理异常就显得尤为重要。本文旨在探讨在Spring中如何更加高效、准确和优雅地处理异常,帮助开发者更好地构建和维护Spring应用。
kfaino
2023/09/26
4K0
Spring | 如何在项目中优雅的处理异常 - 全局异常处理以及自定义异常处理
【面试题精讲】Springboot应用异常处理
Spring Boot应用异常处理是指在Spring Boot应用中对异常进行捕获和处理的机制。当应用发生异常时,可以通过异常处理机制来捕获异常并进行相应的处理,例如返回友好的错误信息给用户,记录异常日志等。
程序员朱永胜
2023/09/25
3160
张三进阶之路 | 基于SpringCloud的异常处理
张三,一位充满热情和创造力的程序猿,就职于一家名为 "CloudBookStore" 的在线书店。这家书店采用了先进的 Spring Cloud 技术栈进行构建,为用户提供了一个直观且易于使用的界面。用户可以在这个界面上浏览、搜索和购买各类书籍,同时,CloudBookStore 还提供了一个功能强大的 API,供第三方开发者集成和扩展其功能。
不惑
2024/04/24
1660
张三进阶之路 | 基于SpringCloud的异常处理
Spring Boot:优雅地处理全局异常以及格式化输出
在Spring Boot应用程序中,全局异常处理是一种非常重要的功能。它可以帮助我们捕获未处理的异常,进行统一处理,并返回给客户端一个友好的错误信息。本文将介绍如何使用Spring Boot优雅地处理全局异常,并提供一些实用的代码示例。
Front_Yue
2024/07/24
1.8K0
Spring Boot:优雅地处理全局异常以及格式化输出
SpringBoot 中如何优雅地处理异常,包括异常处理机制、全局异常处理器、自定义异常?
在开发过程中,异常处理是必不可少的一部分。SpringBoot 是一款非常流行的微服务框架,它提供了丰富的机制来处理异常。本文将介绍 SpringBoot 中如何优雅地处理异常,包括异常处理机制、全局异常处理器、自定义异常等。
网络技术联盟站
2023/06/05
2.7K0
SpringMVC的异常处理(一)
SpringMVC是一种流行的Java Web框架,它为开发人员提供了一种快速、高效的方式来构建Web应用程序。在任何Web应用程序中,异常处理是一个必要的组件,因为它可以帮助我们处理错误和异常情况。SpringMVC提供了一个强大的异常处理机制,使得开发人员能够捕获和处理不同类型的异常,从而提高应用程序的可靠性和可维护性。
堕落飞鸟
2023/05/14
2440
springMVC 统一异常处理异常处理类的使用
在项目开发中各层中都会不可避免的遇到各种可预知和不可预知的异常需要处理,为只专注业务逻辑的实现,需要将异常信息进行统一管理维护处理。
张哥编程
2024/12/19
1430
springMVC 统一异常处理异常处理类的使用
Spring MVC统一异常处理 - `@ExceptionHandler`
在Web应用程序中,错误和异常是不可避免的。Spring MVC框架提供了@ExceptionHandler注解,用于捕获和处理控制器中抛出的异常。通过统一异常处理,可以有效地对应用程序中的异常进行管理和处理,提高用户体验和代码的可维护性。本文将深入探讨@ExceptionHandler的用法和原理,并结合实际项目场景,介绍如何在Spring MVC应用中实现统一异常处理的最佳实践。
王也518
2023/12/20
1.7K0
SpringBoot中REST API的错误异常处理设计
RESTful API中的异常Exception处理有两个基本要求,需要明确业务意义的错误消息以及hhtp状态码。良好的错误消息能够让API客户端纠正问题。在本文中,我们将讨论并实现Spring的REST API异常处理。 Restful API错误/异常设计 在RESTful API中设计异常处理时,最好在响应中设置HTTP状态代码,这样可以表示客户端的请求为什么会失败的原因。当然也可以发送更多信息包括HTTP状态码,这些将帮助客户端迅速定位错误。 比如下面是Springboot表示/api/pro
lyb-geek
2018/08/16
7.2K0
Spring Boot异常处理:优雅处理应用程序错误
异常处理是任何应用程序开发中不可或缺的一部分。Spring Boot提供了强大的异常处理机制,能够帮助开发者优雅地处理各种错误情况,并向用户提供友好的错误信息。本篇博客将介绍Spring Boot中异常处理的基本概念,并通过实例演示如何实现异常处理。
小马哥学JAVA
2024/04/28
3590
掌握 Spring 之异常处理
这次我们学习 Spring 的异常处理,作为一个 Spring 为基础框架的 Web 程序,如果不对程序中出现的异常进行适当的处理比如异常信息友好化,记录异常日志等等,直接将异常信息返回给客户端展示给用户,对用户体验有不好的影响。所以本篇文章主要探讨通过 Spring 进行统一异常处理的几种方式实现,以更优雅的方式捕获程序发生的异常信息并进行适当的处理响应给客户端。
闻人的技术博客
2019/09/19
1.8K0
掌握 Spring 之异常处理
参数校验与国际化:提高代码稳定性和可维护性的重要方法
在我们日常的工作中,参数校验是一项非常重要的任务。它能够帮助我们确保代码的稳定性和可靠性,避免因为参数错误而导致的意外情况发生。参数校验通常包括对输入参数的合法性、格式的检查等。而为了提高代码的可维护性和可重用性,我们可以使用一些常见的参数校验方法。
努力的小雨
2023/12/10
4740
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/10/22
5K0
@ExceptionHandler or HandlerExceptionResolver?如何优雅处理全局异常?【享学Spring MVC】
技术分享 | Spring Boot 异常处理
Java 内部的异常类 Throwable 包括了 Exception 和 Error 两大类,所有的异常类都是 Object 对象。
霍格沃兹测试开发Muller老师
2022/06/08
6110
Spring Cloud 如何统一异常处理?写得太好了!
点击关注公众号,Java干货及时送达 作者:BNDong 链接:www.cnblogs.com/bndong/p/10135370.html 前言 在启动应用时会发现在控制台打印的日志中出现了两个路径为 {[/error]} 的访问地址,当系统中发送异常错误时,Spring Boot 会根据请求方式分别跳转到以 JSON 格式或以界面显示的 /error 地址中显示错误信息。 2018-12-18 09:36:24.627  INFO 19040 --- [           main] s.w.s.
Java技术栈
2022/06/16
1.8K0
Spring Cloud 如何统一异常处理?写得太好了!
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
会洗碗的CV工程师
2023/10/14
4230
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
SpringBoot 如何优雅的进行全局异常处理?
为了实现全局拦截,这里使用到了Spring中提供的两个注解,@RestControllerAdvice和@ExceptionHandler,结合使用可以拦截程序中产生的异常,并且根据不同的异常类型分别处理。下面我会先介绍如何利用这两个注解,优雅的完成全局异常的处理,接着解释这背后的原理。
码老思
2023/10/19
8851
_Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
OK,我们再换一个错误,注释掉以下几行,再重新运行一遍是否跳到错误页面1,因为这里出现的算术错误。
会洗碗的CV工程师
2023/11/18
1680
_Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
推荐阅读
相关推荐
Java后端开发你应该知道的全局异常处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档