- lucene他只是一个插件,一般使用是嵌套在项目里面的.直接看代码
- 需要的jar包截图分词工具很多选择一个支持中文的即可
- 工具类代码
1 package com.chn.supervision.util; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.List; 8 import java.util.Map; 9 10 import org.apache.commons.lang3.StringUtils; 11 import org.apache.lucene.analysis.Analyzer; 12 import org.apache.lucene.analysis.standard.StandardAnalyzer; 13 import org.apache.lucene.document.Document; 14 import org.apache.lucene.document.Field; 15 import org.apache.lucene.document.TextField; 16 import org.apache.lucene.index.DirectoryReader; 17 import org.apache.lucene.index.IndexWriter; 18 import org.apache.lucene.index.IndexWriterConfig; 19 import org.apache.lucene.queryparser.classic.ParseException; 20 import org.apache.lucene.queryparser.classic.QueryParser; 21 import org.apache.lucene.search.IndexSearcher; 22 import org.apache.lucene.search.Query; 23 import org.apache.lucene.search.ScoreDoc; 24 import org.apache.lucene.store.Directory; 25 import org.apache.lucene.store.FSDirectory; 26 import org.apache.lucene.util.Version; 27 import org.wltea.analyzer.lucene.IKAnalyzer; 28 29 import com.chn.supervision.vo.Pollutantwater; 30 31 /** 32 * 33 * @author moon 34 * 35 */ 36 public class LuceneUtil { 37 private static String searchDir = "E:\\Test\\Index"; 38 private static File indexFile = null; 39 private static Analyzer analyzer = null; 40 /** 索引页面缓冲 */ 41 private int maxBufferedDocs = 500; 42 43 /** 44 * 传递集合对象,并且建立索引,返回索引数据 45 * 46 * @param list 47 */ 48 public static void sreachDatas(List<Map> list) { 49 createIndex(list); 50 } 51 52 /** 53 * 为数据库检索数据创建索引,并且这个地方需要定时调用并且创建 54 * 55 * @param list 56 */ 57 private static void createIndex(List<Map> list) { 58 // 存储到内存里面 59 // Directory directory = new RAMDirectory(); 60 // 判断是否存在当前目录,并且创建 61 try { 62 Directory directory = FSDirectory.open(FileUtil 63 .createFileDir(searchDir)); 64 analyzer = new IKAnalyzer(); 65 // 创建IndexWriter,进行索引文件的写入。 66 IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_40, 67 analyzer); 68 IndexWriter iwriter = new IndexWriter(directory, config); 69 Document doc = null; 70 int length = list.size(); 71 for (int i = 0; i < length; i++) { 72 doc = new Document();// 创建文档 73 String address = ""; 74 // 对文档地址创建索引 75 Map map=(Map) list.get(i); 76 if (StringUtils.isNotBlank(map.get("address").toString())) { 77 address =map.get("address").toString(); 78 } 79 doc.add(new Field("address", address, TextField.TYPE_STORED)); 80 iwriter.addDocument(doc);// 添加到文档 81 } 82 iwriter.close(); 83 84 } catch (IOException e) { 85 e.printStackTrace(); 86 } 87 } 88 89 /** 90 * 根据查询字符串检索内容,返回查询集合 91 * 92 * @param str 93 */ 94 public static List sreach(String str) { 95 List<Map> list = new ArrayList<Map>(); 96 Directory directory; 97 try { 98 directory = FSDirectory.open(new File(searchDir)); 99 DirectoryReader ireader = DirectoryReader.open(directory); 100 IndexSearcher isearcher = new IndexSearcher(ireader); 101 QueryParser parser = new QueryParser(Version.LUCENE_40, "address", 102 new StandardAnalyzer(Version.LUCENE_40)); 103 Query query; 104 try { 105 query = parser.parse(str); 106 //第一个事查询,第二个是过滤条件,第三个是查询个数,默认匹配度高的显示在前面 107 ScoreDoc[] hits = isearcher.search(query, null, 10).scoreDocs; 108 for (int i = 0; i < hits.length; i++) { 109 Document hitDoc = isearcher.doc(hits[i].doc); 110 System.out.println(hitDoc.get("address").toString()); 111 Map map=new HashMap(); 112 map.put("address", hitDoc.get("address").toString()); 113 list.add(map); 114 } 115 ireader.close(); 116 directory.close(); 117 } catch (ParseException e) { 118 e.printStackTrace(); 119 } 120 121 } catch (IOException e) { 122 e.printStackTrace(); 123 } 124 return list; 125 } 126 127 }
这个地方有个问题.不知道大家是否关心过这个问题,在选择索引是内存存储还是磁盘存储的时候,到底哪个更加合理的问题;本菜鸟觉得还是存储在磁盘上面好.原因如下,Lucene的索引存储使用的内存也是jvm分配的,这样一来存在垃圾回收的问题,那么也就是只有被回收了,那么这个索引还是需要重新创建,在存储到内存;重新创建索引是很耗费时间空间的.其实这个问题困扰我很久,后来发现他应该是和nio的实现机制是一样的,采用的是堆外分配管理内存的方式.不知道说的对不对,求大神指点一下
- controllers代码:
1 package com.chn.supervision.controllers; 2 3 import java.io.PrintWriter; 4 import java.util.List; 5 import java.util.Map; 6 7 import javax.annotation.Resource; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import org.springframework.stereotype.Controller; 12 import org.springframework.web.bind.annotation.RequestMapping; 13 14 import com.chn.supervision.service.IPollutantwaterService; 15 import com.chn.supervision.util.JsonUtil; 16 import com.chn.supervision.util.LuceneUtil; 17 import com.chn.supervision.vo.Pollutantwater; 18 19 @Controller 20 @RequestMapping("PollutantwaterController") 21 public class PollutantwaterController { 22 23 24 @Resource 25 IPollutantwaterService pollutantwaterService; 26 @RequestMapping("/sreachAddressList") 27 public void sreachAddressList(HttpServletRequest request, 28 HttpServletResponse response,PrintWriter pw){ 29 String address=request.getParameter("v"); 30 List<Map> map=pollutantwaterService.getListBySQL(null);//获取数据集合 31 //LuceneUtil.sreachDatas(map);//初始化索引 32 List list= LuceneUtil.sreach(address); 33 String json= JsonUtil.jsonArray(list, new String[]{}, null); 34 //System.out.println("+++++++"+list); 35 pw.print(json); 36 pw.close(); 37 } 38 39 40 }
- jsp代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP ‘index.jsp‘ starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <style type="text/css"> input{ width: 500px; height: 35px; font-size: 18px; margin-left: 150px; margin-top: 20px; } </style> <link rel="stylesheet" href="js_plugin/jquery.autocomplete/jquery.autocomplete.css" type="text/css"> </head> <body> <div style="margin: 0 auto;width: 800px;height: 500px;"> <input placeholder="请输入条件" id="search" name="search" autocomplete="off"> </div> </body> <script type="text/javascript" src="js_plugin/jquery-1.7.min.js"></script> <script src="js_plugin/jquery.autocomplete/jquery.autocompl ete.js"></script> <script src="js_plugin/jquery.placeholder.min.js"></script> <script> $(function(){ $("#search").placeholder(); }) $("#search").autocomplete("PollutantwaterController/sreachAddressList", { width : 500, scroll : true, matchCase:false, matchContains :true, scrollHeight : 400, extraParams:{v:function() { return $(‘#search‘).val();}}, parse: function(data) { console.log("+++++++++++"+data); return $.map(eval(data), function(row) { return { data: row, value: row.address, //此处无需把全部列列出来,只是两个关键列 result: row.address } }); }, formatItem : function(row, i, max) { //弹出下拉显示文本区域,格式可以自定义 return row.address +"<span style=‘float: right;color: red‘>测试数据</span>"; }, formatResult : function(row, i, max) { //单击确认的时候,给文本框赋值 return row.address ; }, formatMatch : function(row, i, max) { return row.address ; } }); </script> </html>
autocomplete使用这个插件可以明显看到下拉提示;
时间: 2025-01-17 09:39:24