热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

solr进阶八:jQueryUIAutocomplete与solr搜索结合

大致的流程:页面捕获到文字-->传到servlet(Controller)层,servlet层调用后台-->后台根据servlet层传来的参数进行动态从solr中获取数据--&g

大致的流程:

页面捕获到文字 --> 传到servletController)层,servlet层调用后台 --> 后台根据servlet层传来的参数进行动态从solr中获取数据 --> solr 数据返回到servlet层,解析 --> 展现到页面上。

 

solr里面新建一个core,在MySQL数据库里面新建一个表,从这个表导入数据到solrcore中,具体步骤可以上网查或者看我前面的教程。

SQL语句:


SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for lifeixroles
-- ----------------------------
DROP TABLE IF EXISTS `lifeixroles`;
CREATE TABLE `lifeixroles` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`accountId` int(11) DEFAULT NULL,
`level` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`accountName` varchar(255) DEFAULT NULL,
`namePinyin` varchar(255) DEFAULT NULL,
`l99NO` int(11) DEFAULT NULL,
`photoPath` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of lifeixroles
-- ----------------------------
INSERT INTO `lifeixroles` VALUES ('1', '4', '38', '崭露头脚', 'peter', 'peter', '150104', '02/MjAwOTAzMjgyMTM1NTdfMjIwLjI0OS43OS4zNV8zMzM2MDI=.jpg');
INSERT INTO `lifeixroles` VALUES ('2', '8', '1', '小虾米', '立方咖啡', 'lifangkafei', '150108', '20/MjAwOTAyMTYwMzQxMjBfMjIwLjI0OS43OS4zNV82MDYwNTc=..JPG');
INSERT INTO `lifeixroles` VALUES ('3', '11', '46', '名动江湖', 'nick', 'nick', '150121', '10/MjAxNDA2MTMxMTQ2MDVfMTkyLjE2OC4xOTkuNTdfNTA0NDcy.jpg');
INSERT INTO `lifeixroles` VALUES ('4', '10', '1', '小虾米', 'oz', 'oz', '150130', '21/MjAxMjEyMjExNTA5MzlfMTgzLjM3LjM0LjI5XzIzMjA1Nw==.png');
INSERT INTO `lifeixroles` VALUES ('5', '49', '46', '李四', '立方方圆', 'li', '150163', '10/MjAwOTAyMDcxMjQwMzBfMjIwLjI0OS43OS4zNV83MjQ3ODI=..jpg');

schema.xml的部分配置参考:

分词器:

指定数据库配置文件:

由于新建core是拷贝solr-4.10.2\example\multicore这里面的core,所以配置文件非常简单。在自己的core里面看看分词器是否有用,结果显示是有用的:

可是到搜索里面搜索指定字段的部分词语时,搜索不出,只能搜索出全名的:

查找故障很久都找不出为什么,包括把multiValued改为true,虽然不知道具体原因,但是改了这个,但是没有用,显示出的结果带方括号而已。

后来把这些数据导入collection1就正常了,可能是一些关键的东西没有配置,因为原来core里面的配置是最简单的基础配置,这有待于后面的仔细研究学习。搜索出关键词的数据:

这样就好办了,开始编码!

后台还是servletjsonjar包生成json数据返回到前台页面,具体步骤可以看我前面的总结教程。

对象转换成json语句的工具类:src\com\lifeix\util\FastJsonUtil.java

package com.lifeix.util;

import com.alibaba.fastjson.JSON;

/**
* Created by lhx on 14-12-10 下午4:15
*
* @project jspProject
* @package com.lifeix.util
* @blog http://blog.csdn.net/u011439289
* @email 888xin@sina.com
* @Description
*/
public class FastJsonUtil {
/**
* Object实体转换为json
* @param object
* @return
*/
public static String object2json(Object object){
JSON json = (JSON) JSON.toJSON(object);
return json.toJSONString();
}
}

后台从solr服务器上获取数据的处理类:\src\com\lifeix\util\SolrGetFtTopic2.java

package com.lifeix.util;

import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.ModifiableSolrParams;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* Created by lhx on 14-12-9 上午10:30
*
* @project jspProject
* @package com.lifeix.util
* @blog http://blog.csdn.net/u011439289
* @email 888xin@sina.com
* @Description
*/
public class SolrGetFtTopic2 {
private static final String SOLR_URL = "http://localhost:8080/solr/collection1";
public String queryAll(String htmlWord){
ModifiableSolrParams params = new ModifiableSolrParams();
params.set("q","accountName:"+htmlWord);
params.set("start",0);
params.set("rows",10);

params.set("sort","score desc");
params.set("f1","*,score");

SolrServer server = new HttpSolrServer(SOLR_URL);

List> listWord = new ArrayList>();
Map map = null ;
try {
QueryResponse respOnse= server.query(params);
SolrDocumentList list = response.getResults();
for (int i = 0; i map = new HashMap();
SolrDocument document = list.get(i);
map.put("label",document.getFieldValue("l99NO") );
map.put("value", document.getFieldValue("accountName"));
listWord.add(map);
}
return FastJsonUtil.object2json(listWord) ;
} catch (SolrServerException e) {
e.printStackTrace();
}
return null ;
}
}

Servlet层从前台页面获取输入值,再交给后台处理

\src\com\lifeix\servlet\JsonSolrServlet.java

package com.lifeix.servlet;


import com.lifeix.util.SolrGetFtTopic2;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


/**
* Created by lhx on 14-12-10 下午5:29
*
* @project jspProject
* @package ${PACKAGE_NAME}
* @blog http://blog.csdn.net/u011439289
* @email 888xin@sina.com
* @Description
*/
public class JsonSolrServlet extends HttpServlet {

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取网页上文本框输入的内容
String htmlWord = request.getParameter("term").trim();

String jsOnStr= "" ;
SolrGetFtTopic2 solrGetFtTopic = new SolrGetFtTopic2();
if (!"".equals(htmlWord) && htmlWord != null){
//传入参数,根据参数来进行搜索
jsOnStr= solrGetFtTopic.queryAll(htmlWord);
}

PrintWriter pw = null;
try {
response.setContentType("application/json; charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.setHeader("Cache-Control", "no-cache");
pw = response.getWriter();
pw.print(jsonStr);
pw.flush();
}catch (Exception e) {
e.printStackTrace();
}
finally {
if (pw != null)
pw.close();
}
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}

现在是前台页面的jQuery UI Autocomplete代码,这些代码可以参考

jQuery UI Autocomplete官网的远端缓存处理例子:

http://jqueryui.com/autocomplete/#remote-with-cache

jQuery UI AutocompletejQuery UI的自动完成组件

 

我的代码如下:
















jQuery UI Autocomplete

根据用户名搜索(输词语,如:立方,提示龙号):


根据用户名搜索(输词语,如:立方,提示用户名):


根据龙号来搜索(输全部,如:150108):


Email(随便输):


Combobox(选择):





最后的实现效果如下:

——————————————————————————————————————

————————————————————————————————————————


后记:

因为前面改过multiValued的值,改为true了,所以搜索返回的值是带方括号的,导致生成的json语句不是正规的json,所以前台页面解析不了,通过断点调试可以发现这个问题:

另外这个例子还有一个缺点,就是中文输入的话,输入词语不能马上触发事件,要接着敲键盘或者敲一个空格键,jQuery才会把文本中的文字送到后台处理,而英文和数字没有这个问题,这个还要处理!



资料下载:http://pan.baidu.com/s/1jG1gAHK

 

20141212日 补

 

今天上午调试了以下jQuery UI Autocomplete代码,改为以下的模样:

界面输入的时候,还是要多按一个字符才能与后台交互。仔细一看,在汉字没有输入的前提下,就有了一个小下划线:

当设置minLength: 0时,此时就开始触发了,输入完后默认已经触发过一次,不会触发,再在键盘上按多一个键,我按了空格,结果就能把按键之前的文本发送到后台了。

可是,当你用其他浏览器的时候,居然没有这个现象,输入中文的时候,文本框没有小划线。

这是chrome浏览器的:

这是IE11的效果

原来这是jQuery UI Autocomplete在火狐狸上的一个bug

上网找了一下,真的有解决的方法啊!

参考:修复jQuery UI AutocompleteFF中不支持中文的BUG

我的是在jquery-ui-1.8.17.custom.min.js这个文件里改,搜索:blur.autocomplete

127行,原代码格式有点难看,格式化一下代码:

然后变成:

再在此处加上:

.bind("input.autocomplete",function(){
b.search(self.item);
})

刷新一下火狐狸,输入词语,马上就与后台交互了:



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了ASP.NET Core MVC的入门及基础使用教程,根据微软的文档学习,建议阅读英文文档以便更好理解,微软的工具化使用方便且开发速度快。通过vs2017新建项目,可以创建一个基础的ASP.NET网站,也可以实现动态网站开发。ASP.NET MVC框架及其工具简化了开发过程,包括建立业务的数据模型和控制器等步骤。 ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
author-avatar
洱冬橙66_156
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有