首页 > 代码库 > ExtJS 4 spring Mybatis全文检索

ExtJS 4 spring Mybatis全文检索

写在前面的话

  MySQL5.6支持全文检索,而且支持innodb类型表!!!支持中文检索!!!当然词与词之间要有空格等分割符分开才能识别,这一点中英文都一样

1. 建立索引

利用navicat 在设计表中建立FullText类型索引即可,注意“栏位”指要建立索引的列的集合,

可以一列或多列,建立好就可以对其进行检索

在MySQL配置文件中将ft_min_len=1,MySQL全文索引默认3个字符以上,过少字符不能识别,

设定变量ft_min_len=1可以保证一个字符或以上就可以识别

如图所示

2. 前端用的是ExtJS4界面如图所示

2.1界面代码如图所示

  1 Ext.define(‘Cloud.view.SystemManagement.TenantManagement.TenantManager‘, {  2     extend : ‘Ext.grid.Panel‘,  3     store : ‘SystemManagement.TenantManagement.TenantManagementStore‘,  4     alias : ‘widget.SM-TM-list‘,  5     title : ‘租户管理‘,  6     id : ‘SM-TM-list‘,  7     frame : true,  8     width : 320,  9     closable : true, 10     columnLines : true, // True表示为在列分隔处显示分隔符 11     selType : ‘checkboxmodel‘, // 设置复选框 12     trackMouseOver : true, // 是给Grid实现鼠标在行经过时的轨迹效果 13     multiSelect : true, 14     defaults : { 15         anchor : ‘100%‘ 16     }, 17     loadMask : { 18         msg : ‘数据加载中,请稍候‘ 19     }, 20     columns : [ // new Ext.grid.RowNumberer({width: 30}), 21     { 22                 header : ‘租户编号‘, 23                 dataIndex : ‘tenantCode‘, 24                 flex : 1 25             }, 26  27             { 28                 header : ‘租户名称‘, 29                 dataIndex : ‘name‘, 30                 flex : 1 31             }, 32  33             { 34                 header : ‘注册时间‘, 35                 dataIndex : ‘registerTime‘, 36                 flex : 1, 37                 width : 200, 38                 sortable : true, 39                 renderer : function(value) { 40                     if (value != null) { 41                         var dateFormat = new Date(value); 42                         return Ext.Date.format(dateFormat, "Y-m-d H:i:s"); 43                     } 44                 } 45             }, 46  47             { 48                 header : ‘状态‘, 49                 dataIndex : ‘state‘, 50                 id : ‘myidState‘, 51                 fieldLabel : ‘状态‘, 52                 name : ‘news.status‘, 53                 allowBlank : false, 54                 displayField : ‘state‘, 55                 valueField : ‘state‘, 56                 typeAhead : true, 57                 selectOnFocus : true, 58                 mode : ‘remote‘, 59                 triggerAction : ‘all‘, 60                 editable : false, 61                 triggerAction : ‘all‘, 62                 // store : [‘待审核‘,‘已审核‘, ‘已激活‘,‘已禁用‘,‘已关闭‘], 63                 flex : 1, 64                 renderer : function(value) { 65                     if (value =http://www.mamicode.com/= 0) { 66                         return "待审核"; 67                     } else if (value =http://www.mamicode.com/= 1) { 68                         return "已审核"; 69                     } else if (value =http://www.mamicode.com/= 2) { 70                         return "已激活"; 71                     } else if (value =http://www.mamicode.com/= 3) { 72                         return "已禁用"; 73                     } else if (value =http://www.mamicode.com/= 4) { 74                         return "已关闭"; 75                     } else { 76                         return ""; 77                     } 78                 } 79             }, 80  81             { 82                 header : ‘最后状态时间‘, 83                 dataIndex : ‘lastStateTime‘, 84                 flex : 1, 85                 renderer : function(value) { 86                     if (value != null) { 87                         var dateFormat = new Date(value); 88                         return Ext.Date.format(dateFormat, "Y-m-d H:i:s"); 89                         // return value; 90                     } 91                 } 92             }, 93  94             { 95                 header : ‘操作‘, 96                 width : 180, 97                 dataIndex : ‘state‘, 98                 renderer : function(value, cellmeta, record) { 99                     smTmgenerateLinks(value, record);100                     return smTmgenerateLinks(value, record);101                 }102             }],103 104     tbar : ["->", {105                 xtype : ‘textfield‘,106                 emptyText : ‘请输入关键词:‘,107                 id : ‘SM-TM-KeyWord‘108             }, {109                 text : ‘搜索‘,110                 handler : function() {111                     // store.load({ params: { keyword: tenant.getValue()} });112                     var queryStr = Ext.getCmp(‘SM-TM-KeyWord‘).getValue();113                     //alert(queryStr);114                     if(queryStr !="")115                     Ext.getCmp(‘SM-TM-list‘).getStore().load({ params: { queryStr: queryStr} });116                     //alert("Hello World");117                 }118             }],119 120     bbar : [{121                 xtype : ‘pagingtoolbar‘,122                 pageSize : 10,123                 store : ‘SystemManagement.TenantManagement.TenantManagementStore‘,124                 displayInfo : true,125                 displayMsg : "第 {0} - {1} 条&nbsp;&nbsp;&nbsp;共 {2} 条",126                 emptyMsg : "没有记录",127                 plugins : new Ext.ux.ProgressBarPager()128             }],129 130     renderTo : Ext.getBody()131 });132 133 // ///////////////////////////////////////////134 /* 添加操作栏链接模块 */135 // ///////////////////////////////////////////136 function smTmgenerateLinks(value, record) {137     // 0 为待审核,可查看、审核、关闭138     // 1 为已审核,可查看、激活、关闭139     // 2 为已激活,可查看、禁用、关闭140     // 3 为已禁用,可查看、激活、关闭141     // 4 为已关闭,可查看142     // detail_view:查看租户143     // activation:激活租户144     // forbidden:禁用租户145     // close:关闭租户146     // deleteR():删除租户147     var links = ‘‘;148     links = links +"&nbsp;&nbsp;&nbsp;"+ ‘<span style="color:blue;font-weight:bold;cursor:pointer">‘149 //            + ‘<a onclick="smTmdetailView(\‘view\‘)">查看</a>150             +‘查看</span>‘;151     if (value =http://www.mamicode.com/= 0)152         links = links + "&nbsp;&nbsp;&nbsp;"153                 + ‘<span style="color:blue;font-weight:bold;cursor:pointer">‘154 //                + ‘<a onclick="smTmdetailView(\‘review\‘);">审核</a>‘155                 +‘审核</span>‘156                 + "&nbsp;&nbsp;&nbsp;"157                 + ‘<span style="color:red;font-weight:bold;cursor:pointer">‘158 //                + ‘<a onclick="smTmClosed(\‘close\‘);">关闭</a>159                 +‘关闭</span>‘;160     if (value =http://www.mamicode.com/= 1)161         links = links + "&nbsp;&nbsp;&nbsp;"162                 + ‘<span style="color:blue;font-weight:bold;cursor:pointer">‘163 //                + ‘<a onclick="smTmactivation(\‘active\‘);">激活</a>‘164                 +‘激活</span>‘165                 + "&nbsp;&nbsp;&nbsp;"166                 + ‘<span style="color:red;font-weight:bold;cursor:pointer">‘167 //                + ‘<a onclick="smTmClosed(\‘close\‘);">关闭</a>168                 +‘关闭</span>‘;169     if (value =http://www.mamicode.com/= 2)170         links = links + "&nbsp;&nbsp;&nbsp;"171                 + ‘<span style="color:red;font-weight:bold;cursor:pointer">‘172 //                + ‘<a onclick="smTmforbidden(\‘forbide\‘);">禁用</a>173                 +‘禁用</span>‘;174     if (value =http://www.mamicode.com/= 3)175         links = links + "&nbsp;&nbsp;&nbsp;"176                 + ‘<span style="color:red;font-weight:bold;cursor:pointer">‘177 //                + ‘<a onclick="smTmClosed(\‘close\‘);">关闭</a>178                 +‘关闭</span>‘;179     if (value =http://www.mamicode.com/= 4)180         links = links + "&nbsp;&nbsp;&nbsp;"181                 + ‘<span style="color:red;font-weight:bold;cursor:pointer">‘182 //                + ‘<a onclick="smTMdeleteR(\‘delete\‘);">删除</a>183                 +‘删除</span>‘;184     return links;185 }

2.2回调函数(controller层逻辑控制代码)如图所示

//向后台传数据1.    tbar : ["->", {                xtype : ‘textfield‘,                emptyText : ‘请输入关键词:‘,                id : ‘SM-TM-KeyWord‘            }, {                text : ‘搜索‘,                handler : function() {                  //store.load({ params: { keyword: tenant.getValue()} });                  var queryStr = Ext.getCmp(‘SM-TM-KeyWord‘).getValue();                             if(queryStr !="")                  Ext.getCmp(‘SM-TM-list‘).getStore()                  .load({ params: { queryStr: queryStr} });                }            }],   //传给后端的getTenant映射的函数getTenantByCode()进行处理  2.Ext.define(‘Cloud.store.SystemManagement.TenantManagement.TenantManagementStore‘, {      extend: ‘Ext.data.Store‘,      model: ‘Cloud.model.SystemManagement.TenantManagement.TenantManagementModel‘,      storeId:‘tenant-store‘,      pageSize : 10,      autoLoad: true,      fields: [‘id‘, ‘name‘,‘registertime‘,‘state‘,‘laststatetime‘,‘operation‘],      proxy: {         type: ‘ajax‘,         url: ‘getTenant‘,         reader: {            type: ‘json‘,            root: ‘root‘,            successProperty: ‘success‘,            totalProperty: ‘total‘        }      } });

3. 后端controller层dao层spring+Mybatis

controller层

根据传到后端的查询字符串是否为空决定是否进行查询处理,如果为空,不进行查询处理,(只要看queryStr != null分支即可)

@RequestMapping(value="http://www.mamicode.com/getTenant", method=RequestMethod.GET)  // 请求url地址映射,类似Struts的action-mapping     Public @ResponseBody Object getTenantByCode(           @RequestParam(value="start")Integer start,            @RequestParam(value="limit")Integer limit,@RequestParam(value="queryStr",required = false)String queryStr      ) throws Exception {        List<Tenant> list = null;        Map<String, Object> map = new HashMap<String,Object>();        if (queryStr == null){            //System.out.println("nothing");            int num = tenantService.getTenantNum();            list =tenantService.getTenantByCode(start, limit);            map.put("root", list);            map.put("success", true);            map.put("total", num);                    }else{        String str = new String(queryStr.getBytes("ISO-8859-1"), "UTF-8");            //System.out.println(str);            list = tenantService.queryTenant(str, start, limit);            int num = list.size();            map.put("root", list);            map.put("success", true);            map.put("total", num);                    }         return map;                }

  dao

  in boolean mode 使得数据库对查询字符串进行必要的处理,

  如“android baidu”表示 android 百度有其中一个的记录即可被查询到

  如“+android+baidu”表示android baidu都有的记录才能被查询到

  更详细的说明请查相关文档

  例子  

<select id="queryTenant" statementType="CALLABLE" resultMap="TenantMap">

<![CDATA[

 SELECT * from r_um_tenants  WHERE MATCH (Tenant_Name,Address,Contactor) AGAINST

(#{queryStr} IN BOOLEAN MODE)

]]>

</select>    

4.分词系统采用IKAnalyzer中文分词器V2012_FF

网上百度很容易找到,使用中文分词器能够让要全文检索的内容根据中文习惯分好词,再存入数据库中,还记得词与词之间要有空格等分割符分开才能识别吗,这样MySQL就能使用全文检索功能了,使用如下:

StringBuilder strb = new StringBuilder(30);        StringReader re = new StringReader(str);        IKSegmenter ik = new IKSegmenter(re,true);        Lexeme lex = null;        while((lex=ik.next())!=null){           strb.append(lex.getLexemeText()+" ");        }        return strb.toString();

5.参考网址链接

http://lucene.apache.org/core/4_10_0/demo/index.html

http://www.oschina.net/code/snippet_96637_23214

http://www.liutime.com/javainfo/706/

http://blog.csdn.net/fanpeii/article/details/7561122

 

ExtJS 4 spring Mybatis全文检索