码迷,mamicode.com
首页 > Web开发 > 详细

lucene 前后端简单使用例子

时间:2016-08-01 15:14:07      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

  1. lucene他只是一个插件,一般使用是嵌套在项目里面的.直接看代码
  2. 需要的jar包截图分词工具很多选择一个支持中文的即可
    技术分享

     

  3. 工具类代码
      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的实现机制是一样的,采用的是堆外分配管理内存的方式.不知道说的对不对,求大神指点一下

  4. 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 }
  5. 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使用这个插件可以明显看到下拉提示;

lucene 前后端简单使用例子

标签:

原文地址:http://www.cnblogs.com/xbgfy/p/5725597.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!