以下内容,并未得到实质检测。因为笔者没有用到相关的需求,只是一时兴起,按照自己的思路探究了一下。并未考虑什么付费排名,词语优先级,搜索量排名,时效性等等的因素。娱乐一下呗,可能会被真正做过此类搜索的大神笑话,担待自己瞎想的。

二、简单算法分词匹配:

/**简单算法之
 * 拆分用户输入框输入的语句,进行最大化匹配查询
 * @param str:用户输入的查询内容
 * Red_Ant 20181124
 */
public static final String PUTUATION = "。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑·¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<­­__-\\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼";
public static List<String> dealInputStr(String str) {
	/*我们输入内容进行查询之后,总会有一些优先显示在最前面(付费排名的除外)
	 * 假设,查出的最终结果是String类型的
	 */
	//1、创建存储最终结果的集合
	List<String> resultLst = new ArrayList<String>();
	//2、优先级最高的就是,把用户输入的内容看做一个整体查出的内容
	List<String> strLst = selectStrFromDataBase(str);//从相应的库中查询,内容。方法不同,此处略!
	if(strLst.size() > 0) {
		resultLst.addAll(strLst);
	}
	//3、接着我们利用,用户输入中的标点,将输入语句分割成不同的str【以常用标点为例】
	//笔者又想到,标点也有许多区别,和优先之分。算啦,不做深究了。
	String[] strs = str.split("");
	int strsLength = strs.length;
	List<Integer> num = new ArrayList<Integer>();
	for (int i = 0; i < strsLength; i++) {
		if(PUTUATION.contains(strs[i])) {
			num.add(i);
		}
	}
	//将输入语句,按照标点的位置进行分词
	int j = 0;//存储截取字符串位置
	/*用于存储,标点分词之后的结果
	 * 然后依照此结果进行细胞分词
	 */
	String ss;
	List<String> pttstrLst = new ArrayList<String>();
	for (int i = 0; i < num.size(); i++) {
		if(i == num.size()-1) {
			ss = str.substring(j);
		}else {
			ss = str.substring(j, num.get(i));
		}
		pttstrLst.add(ss);
		strLst = selectStrFromDataBase(ss);
		if(strLst.size() > 0) {
			resultLst.addAll(strLst);
		}
		j = num.get(i) + 1;
	}
	/*4、将标点分词后的结果进行细胞分词
	 * 利用字符字数逐步-1,的左右相邻截取方式,将分词后的内容,分别匹配细胞词库
	 * 每减少一n字,或有n+1种可能,直到只剩两个字为止。
	 */
	String ss1;
	for (int i = 0; i < pttstrLst.size(); i++) {
		//jugeWord(String str),查询数据库的方法略!
		ss = pttstrLst.get(i);
		int len = ss.length() - 2;
		int s = 0;
		int strlen = ss.length();
		while (len > 1) {
			int len1 = strlen - 2;
			while (len1 < strlen-1) {
				ss1 = ss.substring(s, len1);
				if(!jugeWord(ss1)) {
					strLst = selectStrFromDataBase(ss1);
					if(strLst.size() > 0) {
						resultLst.addAll(strLst);
					}
				}
				s++;
				len1++;
			}
			len--;
		}
	}
	return resultLst;
}

【注意】 以上方法并未在真实场景中的应用,还有许多未考虑的因素,笔者想若此方法行的通的话,还有许多值得考虑和优化的地方。