注册网站卖钱最多的人网络建站工作室官网源码
- 作者: 五速梦信息网
- 时间: 2026年04月20日 05:05
当前位置: 首页 > news >正文
注册网站卖钱最多的人,网络建站工作室官网源码,wordpress可视化编辑器不见,多米诺网站建设目录 自动补全
拼音分词器
安装拼音分词器
第一步#xff1a;下载zip包#xff0c;并解压缩
第二步#xff1a;去docker找到es-plugins数据卷挂载的位置#xff0c;并进入这个目录 第三步#xff1a;把拼音分词器的安装包拖到这个目录下
第四步#xff1a;重启es
第…目录 自动补全
拼音分词器
安装拼音分词器
第一步下载zip包并解压缩
第二步去docker找到es-plugins数据卷挂载的位置并进入这个目录 第三步把拼音分词器的安装包拖到这个目录下
第四步重启es
第五步测试拼音分词器
自定义分词器
如何自定义分词器呢
编辑 声明自定义分词器的语法如下
测试自定义的分词器
总结 自动补全查询 实现酒店搜索框自动补全 修改酒店索引库的映射结构
修改HotelDoc实体类 批量插入数据到es的hotel库中
自动补全查询的JavaAPI 实现搜索框自动补全 controller
service
结果 分析 自动补全
当用户在搜索框输入字符时我们应该提示出与该字符有关的搜索项如图 这种根据用户输入的字母提示完整词条的功能就是自动补全了。
因为需要根据拼音字母来推断因此要用到拼音分词功能。
拼音分词器
要实现根据字母做补全就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。地址GitHub - infinilabs/analysis-pinyin: This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.
安装拼音分词器
第一步下载zip包并解压缩
第二步去docker找到es-plugins数据卷挂载的位置并进入这个目录 第三步把拼音分词器的安装包拖到这个目录下
py就是拼音分词器的安装包 第四步重启es
docker restart es
第五步测试拼音分词器
对text文本使用拼音分词器的默认分词器-pinyin 可以发现对text文本进行了拼音分词但是并不够完整如:shanghai,shanghaiwaitan等所以我们需要自定义分词器 自定义分词器
我们发现默认的拼音分词器只是把每个汉字的拼音给分词出来而我们希望的是每个词条形成一组拼音所以我们需要对拼音分词器做个性化定制形成自定义分词器。
如何自定义分词器呢
elasticsearch中分词器analyzer的组成包含三部分
character filters在tokenizer之前对文本进行处理。例如删除字符、替换字符tokenizer将文本按照一定的规则切割成词条term。如果文本是keyword就进行不分词tokenizer filter将tokenizer输出的词条做进一步处理对分词分出来的词条后进行下一步处理。例如大小写转换、同义词处理、拼音处理等
文档分词时会依次由这三部分来处理文档 声明自定义分词器的语法如下 这里定义mapping结构时对字段text的分词类型使用的是自定义的分词器先对text文本进行分词处理后再对这些分出来的词进行拼音处理然后把分出的词条和词条的拼音都加入到倒排索引库中。 我们还设置了search_analyzer属性为ik_smart,如果不设置search_analyzer的值默认和analyzer的属性值一样都是自定义的分词器。 那我们为什么要额外设置呢 因为在进行搜索时输入 狮子,使用自定义的分词器进行搜索时也会把狮子变成shizi去倒排索引库中搜索就会搜索出相同读音的其他词比如虱子这显然是不对的。 所以进行搜索时指定使用ik_smart进行搜索不会把中文变成拼音去搜索输入拼音也可以到倒排索引库中搜索因为构建索引时把词条的拼音也加入到了倒排索引库。 PUT /test
{settings: {analysis: {analyzer: { // 自定义分词器my_analyzer: { // 分词器名称tokenizer: ik_max_word, //使用最细分词对文本内容进行分词创建倒排索引filter: py //过滤器使用自定义的}},filter: { // 自定义tokenizer filterpy: { // 过滤器名称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: {name: {ktype: text,analyzer: my_analyzer, # 保存文档内容时使用自定义分词器-》写操作search_analyzer: ik_smart # 搜索时使用ik_smart —》读操作}}}
}
参数详细说明
keep_first_letter:这个参数会将词的第一个字母全部拼起来.例如:刘德华-ldh.默认为:true
keep_separate_first_letter:这个会将第一个字母一个个分开.例如:刘德华-l,d,h.默认为:flase.如果开启,可能导致查询结果太过于模糊,准确率太低.
limit_first_letter_length:设置最大keep_first_letter结果的长度,默认为:16
keep_full_pinyin:如果打开,它将保存词的全拼,并按字分开保存.例如:刘德华 [liu,de,hua],默认为:true
keep_joined_full_pinyin:如果打开将保存词的全拼.例如:刘德华 [liudehua],默认为:false
keep_none_chinese:将非中文字母或数字保留在结果中.默认为:true
keep_none_chinese_together:保证非中文在一起.默认为: true, 例如: DJ音乐家 - DJ,yin,yue,jia, 如果设置为:false, 例如: DJ音乐家 - D,J,yin,yue,jia, 注意: keep_none_chinese应该先开启.
keep_none_chinese_in_first_letter:将非中文字母保留在首字母中.例如: 刘德华AT2016-ldhat2016, 默认为:true
keep_none_chinese_in_joined_full_pinyin:将非中文字母保留为完整拼音. 例如: 刘德华2016-liudehua2016, 默认为: false
none_chinese_pinyin_tokenize:如果他们是拼音,切分非中文成单独的拼音项. 默认为:true,例如: liudehuaalibaba13zhuanghan - liu,de,hua,a,li,ba,ba,13,zhuang,han, 注意: keep_none_chinese和keep_none_chinese_together需要先开启.
keep_original:是否保持原词.默认为:false
lowercase:小写非中文字母.默认为:true
trim_whitespace:去掉空格.默认为:true
remove_duplicated_term:保存索引时删除重复的词语.例如: de的de, 默认为: false, 注意:开启可能会影响位置相关的查询.
ignore_pinyin_offset:在6.0之后,严格限制偏移量,不允许使用重叠的标记.使用此参数时,忽略偏移量将允许使用重叠的标记.请注意,所有与位置相关的查询或突出显示都将变为错误,您应使用多个字段并为不同的字段指定不同的设置查询目的.如果需要偏移量,请将其设置为false。默认值:true
测试自定义的分词器 可以发现结果是分出来的词条和词条的拼音 总结
如何使用拼音分词器 ①下载pinyin分词器 ②解压并放到elasticsearch的plugin目录 ③重启即可
如何自定义分词器 ①创建索引库时在settings中配置可以包含三部分 ②character filter ③tokenizer ④filter
拼音分词器注意事项
为了避免搜索到同音字搜索时不要使用拼音分词器 自动补全查询
elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率对于文档中字段的类型有一些约束 参与补全查询的字段必须是completion类型。 字段的内容一般是用来补全的多个词条形成的数组这些词条也叫做关键词作用就是补全。
比如一个这样的索引库
PUT test
{mappings: {properties: {title:{type: completion}}}
} 然后插入下面的数据
给三个文档插入它们对应的关键词组不写文档ides默认会自动生成一个文档id
POST test/_doc
{title: [Sony, WH-1000XM3]
}
POST test/_doc
{title: [SK-II, PITERA]
}
POST test/_doc
{title: [Nintendo, switch]
} 查询的DSL语句如下
GET /test/_search
{suggest: {title_suggest: { //补全的名字text: s, // 关键字completion: {field: title, // 补全查询的字段skip_duplicates: true, // 跳过重复的size: 10 // 获取前10条结果}}}
}
结果返回了三个补全信息分别是SK-II,Sony,switch,这三个词分别是三个文档里的关键词信息 实现酒店搜索框自动补全
现在我们的hotel索引库还没有设置拼音分词器需要修改索引库中的配置。但是我们知道索引库是无法修改的只能删除然后重新创建。
另外我们需要添加一个字段用来做自动补全将brand、suggestion放进去作为自动补全的提示。
因此总结一下我们需要做的事情包括 修改hotel索引库结构设置自定义拼音分词器 修改索引库的name、all字段使用自定义分词器 索引库添加一个新字段suggestion类型为completion类型使用自定义的分词器 给HotelDoc类添加suggestion字段内容包含brand、business 重新导入数据到hotel库 修改酒店索引库的映射结构 这里设置了两个自定义分词器一个分词器需要使用ik分词器搜索框的文本内容进行搜索时需要进行分词一个分词器是keyword不需要进行分词这个是suggestion字段使用的分词器因为suggestion存的是关键字数组关键字是我们自己设置的所以不需要进行分词了 // 酒店数据索引库
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}}}
}
修改HotelDoc实体类 suggestion设置为ListString属性然后把brand,business,city作为关键字存入suggestion数组中 /*** 构建一个Hotel类插入es索引库的封装类类/
Data
NoArgsConstructor
public class HotelDoc {private Long id;private String name;private String address;private Integer price;private Integer score;private String brand;private String city;private String starName;private String business;private String location;private String pic;//距离private Object distance;//是否打广告private boolean isAD;//价值private Integer value;//关键字集合private ListStringsuggestion;public HotelDoc(Hotel hotel){this.idhotel.getId();this.namehotel.getName();this.addresshotel.getAddress();this.pricehotel.getPrice();this.scorehotel.getScore();this.brandhotel.getBrand();this.cityhotel.getCity();this.starNamehotel.getStarName();this.businesshotel.getBusiness();this.locationhotel.getLatitude(), hotel.getLongitude();this.pichotel.getPic();// 组装suggestionif(this.business.contains(/)){// business有多个值需要切割String[] arr this.business.split(/);// 添加元素this.suggestion new ArrayList();this.suggestion.add(this.brand);this.suggestion.add(this.city);Collections.addAll(this.suggestion, arr);}else {this.suggestion Arrays.asList(this.brand, this.business,this.city);}}
}批量插入数据到es的hotel库中 /** 批量导入数据/Testpublic void test05() throws IOException {//使用mapper查询到所有数据ListHotel hotels hotelMapper.selectList(null);BulkRequest bulkRequest new BulkRequest(hotel);hotels.stream().forEach(hotel - {//把hotel变成hotelDoc类对象并序列化成json数据String jsonDSL JSON.toJSONString(new HotelDoc(hotel));//构建 新增文档请求对象IndexRequest request new IndexRequest(hotel).id(hotel.getId()).source(jsonDSL, XContentType.JSON);//将请求对象添加到bulkRequest中bulkRequest.add(request);});//发送请求restHighLevelClient.bulk(bulkRequest,RequestOptions.DEFAULT);}
插入成功 自动补全查询的JavaAPI 解析数据 实现搜索框自动补全
查看前端页面可以发现当我们在输入框键入时前端会发起ajax请求 返回值是补全词条的集合类型为ListString controller /** 补全功能* param prefix 需要补全的内容/GetMapping(suggestion)public ListString getSuggestions(RequestParam(key) String prefix) {return hotelService.getSuggestions(prefix);}
service
/** 补全功能* param prefix 需要补全的内容*/Overridepublic ListString getSuggestions(String prefix) {SearchRequest request new SearchRequest(hotel);request.source().suggest(new SuggestBuilder().addSuggestion(mySuggestion,SuggestBuilders.completionSuggestion(suggestion).prefix(prefix).skipDuplicates(true).size(10)));//发起请求SearchResponse response null;try {response restHighLevelClient.search(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(补全功能失效);}//解析返回数据Suggest suggest response.getSuggest();//根据名称获取补全结果CompletionSuggestion mySuggestion suggest.getSuggestion(mySuggestion);ListStringsuggestionsnew ArrayList();//如果不存在这个名字的补全名字或者没有匹配的关键字直接返回空集合if(mySuggestionnull||CollectionUtils.isEmpty(mySuggestion.getOptions())){return suggestions;//返回空集合}for (CompletionSuggestion.Entry.Option option : mySuggestion.getOptions()) {String key option.getText().string();suggestions.add(key);}return suggestions;}结果 分析
1.实现搜索内容补全为什么要额外创建一个关键词数组字段
因为如果直接把all字段作为关键字字段是时需要匹配搜索的内容过于庞大。
2.关键字自动补全的好处
输入一个拼音可以自动补全要搜索的内容用户可以直接点击补全的内容前端就会直接使用补全的内容去es进行搜索匹配效率更高
3.为什么输入拼音可以自动补全出中文的内容
因为我们自定义了一个关键字分词器里面有一个拼音分词器会把中文和中文对应的拼音都加入到suggestion字段的倒排索引库中输入拼音然后根据倒排索引库自动补全这个拼音全称,最后再根据这个拼音全称匹配到我们自定义的关键字 根据shang拼音自动补全到上海产业园关键字 和上海关键字 4.不使用关键字补全直接使用拼音进行搜索可以出结果吗
可以因为all字段也使用的自定义的分词器会把分词后的词条拼音也加入到all字段的倒排索引库中所以也可以直接使用拼音搜索
- 上一篇: 注册网站可以注销嘛利用腾讯云建设网站
- 下一篇: 注册网站名字网站建设中文摘要是什么
相关文章
-
注册网站可以注销嘛利用腾讯云建设网站
注册网站可以注销嘛利用腾讯云建设网站
- 技术栈
- 2026年04月20日
-
注册网站登录wordpress评论特效
注册网站登录wordpress评论特效
- 技术栈
- 2026年04月20日
-
注册网站地址第1行第二行怎么填微网站设计
注册网站地址第1行第二行怎么填微网站设计
- 技术栈
- 2026年04月20日
-
注册网站名字网站建设中文摘要是什么
注册网站名字网站建设中文摘要是什么
- 技术栈
- 2026年04月20日
-
注册网站能赚钱吗局网站建设意见
注册网站能赚钱吗局网站建设意见
- 技术栈
- 2026年04月20日
-
注册网站需要营业执照吗设计图案用什么软件
注册网站需要营业执照吗设计图案用什么软件
- 技术栈
- 2026年04月20日
