什么是Search Suggest(搜索建议),上一个截图大家就知道:

对,就是一个输入提示,问了很多人,都以为我是说前台ajax的实现问题。因为很多人都觉得后台数据只要一个select就可以得到……但真的是一个select就可以得到吗?我想了好久都没想到这条select怎么写,于是开始自己琢磨。

我所想到的首先要做的是将输入的东西拆分。比如sg要拆分为[s,g],sog要拆分为[so,g],soug=>[sou,g],sougou => [sou,gou]等等……,当然了,有一些拼音很难拆,比如xian这样的,我的做法是对于这种拼音在拆分环节不进行拆分,即:xian => [xian]。

首先要找到一份字库,我在网上下了一份:

字库对提示的影响很大,好的字库能提高很大效率。载入字库很简单,就是Properties的load,我要说的是载入字库后要进行的一些操作:

载入字库后首先要对字库所有的拼音进行分析,将其分析成一棵树:

a

-i

--n

---g

-o

-n

这样才能对用户输入的拼音进行分析。

这是我的代码:

     for (Iterator it = ziku.keySet().iterator(); it.hasNext();) {String key = (String) it.next();char ch = key.charAt(0);PinyinCharNode root = roots.get(ch);if (root == null) {root = PinyinCharNode.valueOf(ch);roots.put(ch, root);}PinyinCharNode node = root;for (int i = 1; i < key.length(); i++) {ch = key.charAt(i);PinyinCharNode tempNode = node.getNodeByChar(ch);if (tempNode == null) {node = node.addNode(ch);} else {node = tempNode;}}}

注释:roots是一个Map类型的对象,保存所有的根节点

下一步工作就是分析用户输入的过程。

1、优先对隔音符进行切分

2、逐个字符进行分析,在第一个字符时获取roots里的数据,如果获取不到,则该这个音符不是声母或a,o,e开头的韵母(a,o,e开头的韵母可以作为单独音节)

3、如果获得root,再分析下一个字符是否为root的子节点。循环下去,直到某个节点,那个节点的下一个字符在这个节点的子节点内无法找到,这时下一个节点作为下一个音节的开始字符

4、循环,直到完成整个字符串

 public static List<String> splitPinyin(String pinyin) {String[] pinyins = pinyin.split("'");// 优先使用隔音符List<String> resultPinyins = new ArrayList<String>();for (String s : pinyins) {int index = 0;PinyinCharNode node = roots.get(s.charAt(index));StringBuffer notPinyin = new StringBuffer();while (index < s.length() && node == null) {notPinyin.append(s.charAt(index));index++;if (index < s.length())node = roots.get(s.charAt(index));}if (notPinyin.length() > 0) {resultPinyins.add(notPinyin.toString());notPinyin = new StringBuffer();}if (index == s.length()) {return resultPinyins;}StringBuffer bufPinyin = new StringBuffer();bufPinyin.append(s.charAt(index));if (index == s.length() - 1) {resultPinyins.add(bufPinyin.toString());}for (int i = index + 1; i < s.length(); i++) {if (!Character.isLetter(s.charAt(i))) {// 如果不是字母if (bufPinyin.length() > 0) {resultPinyins.add(bufPinyin.toString());bufPinyin = new StringBuffer();}resultPinyins.add(String.valueOf(s.charAt(i)));continue;}PinyinCharNode tempNode = node.getNodeByChar(s.charAt(i));if (tempNode == null) {if (bufPinyin.length() > 0)resultPinyins.add(bufPinyin.toString());bufPinyin = new StringBuffer();bufPinyin.append(s.charAt(i));node = roots.get(s.charAt(i));if (i == s.length() - 1) {resultPinyins.add(bufPinyin.toString());}} else {bufPinyin.append(s.charAt(i));if (i == s.length() - 1) {resultPinyins.add(bufPinyin.toString());}node = tempNode;}}}return resultPinyins;}

这个方法我测试了几次,应该没有问题。

附PinyinCharNode.java代码:

public class PinyinCharNode {private PinyinCharNode() {super();}private char ch;private List<PinyinCharNode> nodes = Collections.synchronizedList(new ArrayList<PinyinCharNode>());public char getCh() {return ch;}public void setCh(char ch) {this.ch = ch;}public List<PinyinCharNode> getNodes() {return nodes;}public void setNodes(List<PinyinCharNode> nodes) {this.nodes = nodes;}public void addNode(PinyinCharNode node) {this.nodes.add(node);}public PinyinCharNode addNode(char node) {PinyinCharNode p = valueOf(node);addNode(p);return p;}public PinyinCharNode getNodeByChar(char ch) {for (PinyinCharNode node : nodes) {if (ch == node.getCh()) {return node;}}return null;}private PinyinCharNode(char ch) {super();this.ch = ch;}public static PinyinCharNode valueOf(char ch) {return new PinyinCharNode(ch);}
}

PS:本人绝对是新手……本人也绝对是新手文……但属本人原创……高手请飘过……

制作自己的Search Suggest 1-拼音切分相关推荐

  1. 基于Trie树的拼音切分算法

    基于Trie树的拼音切分算法 Trie树也叫做单词查找树,是一个非常有效的索引结构,trie是由retrieval演化而来的.具体介绍请参看–> [ 维基百科 ] Trie树结构的简单说明 Tr ...

  2. Bootstrap Search Suggest 插件使用

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...

  3. solr suggest 实现拼音或汉字 输入都能达到推荐搜索的要求.

    我的案例 这里我们对title做suggest推荐搜索, 例如搜索"魔兽世界"和"moshoushijie" 都能出现 "魔兽世界XXXX" ...

  4. debian 10 buster 安装配置 elastic search 和 中文, 拼音分词

    debian 10 buster 安装配置 es 和 中文, 拼音分词 安装 测试 配置 分词 IK 分词器 拼音分词 一个完整的动态映射模板(包含geo, pinyin, IK) 安装 1, 安装j ...

  5. search.php制作,重写搜索Search类

    Search类用于对模块内容的搜索,开发者可以对其进行重写继承,以便适用于自己项目的二次开发. 我们以Demo模块为例,新建App/Demo/Models/Search.php<?php  na ...

  6. elastic search suggest智能输入即提示java案例

    创建索引 put housesuggest 2.创建映射 POST housesuggest/doc/_mapping { "properties": {"houseid ...

  7. solr6.6.2之拼音联想

    2019独角兽企业重金招聘Python工程师标准>>> 1.软件版本介绍 SOLR版本:6.6.2 Luccence:6.6.2 jdk版本:1.8.0.x系列 Zookeeper: ...

  8. Solr之拼音检索。

    拼音检索中国人的专用检索,例如:中文内容为"中国"的输入 "zhongguo"."zg"."zhonggu 全拼".&q ...

  9. SpringBoot2.2.2+Elasticsearch7.6.2实现中文、拼音、拼音首字母智能提示功能

    一.Elasticsearch介绍 1.1 Elasticsearch是什么 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfu ...

最新文章

  1. 系统架构设计师考试知识点整理-1:操作系统的类型和结构
  2. micropython实现多任务_python多任务处理
  3. python------面向对象介绍
  4. c 语言str.size,C/C++ strlen(str)和str.length()和str.size()的区别
  5. 如何手撸一个队列?队列详解和面试题汇总(含答案)
  6. 李明顺专栏周5月12日:给门户支招
  7. 苹果硬件技术高级副总裁揭露:自研 M1 太难了
  8. 让程序暂停几秒_如何构建一个简单的Python提醒应用程序
  9. Count-Min Sketch 算法
  10. CacheCloud部署与群集申请流程测试
  11. 泰山OFFICE在LINUX上输入法候选框位置错误的两个解决思路
  12. DSOFramer的类别和安装
  13. 推荐一款基于bootstrap的漂亮的前端模板——inspinia_admin(国内翻译的叫 H+后台主题UI框架)
  14. since it exceeds Excel‘s limit of 65,530 URLS per worksheet
  15. 终于还是对闲鱼下手了。闲鱼爬虫,idlefish spider来了
  16. 计算机打字键盘怎么控制,键盘不受控制怎么办?
  17. Docker服务条款:禁止名单内的个人团体使用,自2020年8月13日起生效
  18. 在计算机中将硬盘上的数据复制到u盘上称为,怎样将旧电脑所有数据(包括系统盘数据),全部复制到新电脑上?...
  19. 工作十年的数据分析师被炒,没有方向,你根本躲不过中年危机
  20. 《计算机应用基础》在线作业一

热门文章

  1. Xilinx 7系列例化MIG IP core DDR3读写
  2. 【人生苦短,我学 Python】序言
  3. 2023年温州医科大学眼科学考研考情与难度、参考书及上岸前辈经验
  4. lineedit设置字左边距_标书中标题都是用的几号字?什么字体?
  5. 【头歌】Pandas进阶
  6. Validate Credit Card Number
  7. Openstack Liberty 版本原生环境创建虚拟机BDM参数组合规范
  8. touchGFX学习
  9. 西北大学应用计算机自考,西北大学自考的官方网站是???
  10. 电离层对高分辨率星载SAR成像的影响4——电离层对方位向成像的影响