lucene 前后端简单使用例子

  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使用这个插件可以明显看到下拉提示;
时间: 2025-01-17 09:39:24

lucene 前后端简单使用例子的相关文章

前后端简单的接口测试

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://cdn.bootcss.com/jquery/1.11.1-beta1/jquery.js"></script> </head>

也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本.为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接口,前端负责展现/交互逻辑,同一份数据接口,我们可以定制开发多个版本. 这个话题最近被讨论得比较多,阿里有些BU也在进行一些尝试.讨论了很久之后,我们团队决定探索一套基于NodeJS的前后端分离方案,过程中有一些不断变化的认识以及思考,记录在这里,也希望看到的同学参

基于NodeJS的全栈式开发(基于NodeJS的前后端分离)

也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离) 前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的NodeJS,试图探索一条全新的前后端分离模式. 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本.为了提升开发效率,前后端分离的需求越

前后端分离实践【转】

前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了“前后端”的定义,引入前端同学都熟悉的NodeJS,试图探索一条全新的前后端分离模式. 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本.为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接口,前端负责展现/交互逻辑,同一份

前后端分离的思考与实践(一)

原文出处: 淘宝UED - 常胤 也谈基于NodeJS的全栈式开发(基于NodeJS的前后端分离) 前言 为了解决传统Web开发模式带来的各种问题,我们进行了许多尝试,但由于前/后端的物理鸿沟,尝试的方案都大同小异.痛定思痛,今天我们重新思考了"前后端"的定义,引入前端同学都熟悉的NodeJS,试图探索一条全新的前后端分离模式. 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制

大前端与前后端分离

一.大前端 简单来说,大前端就是所有前端的统称,比如Android.iOS.web.Watch等,最接近用户的那一层也就是UI层,然后将其统一起来,就是大前端.大前端最大的特点在于一次开发,同时适用于所有平台,开发者不用为一个APP需要做Android和iOS两种模式而担心.大前端是web统一的时代,利用web不仅能开发出网站,更可以开发手机端web应用和移动端应用程序. 由于node的出现,前端工程师不需要依赖于后端程序而直接运行,从而前后端分离起来.所以当开发一个新产品的时候服务只需要写一次

前后端分离实践(试探篇)

按照以往的开发模式,前端人员制作好静态页面交给与后端人员进行动态嵌套开发.迭代模式带来一系列问题,静态页面套成动态后,一些操作.业务.模版技术等动态页面已经跟静态页面有了一些差距.这时候前端人员改了一个BUG,或者叠加了一个功能,后端人员就必须向前端人员了解更改的范围,再叠加,由于都是人为过程,带来很多困扰,开发效率也很低. 当前后端页面以及逻辑没有合并之前,测试人员面临等待的问题,能否让测试与开发并行也是我们需要考虑的一个问题. 这时候我们想到了,能否以暴露服务的方式把java的接口暴露出来交

初识 vue —— 最简单的前后端交互示例

一.初识 vue 时的困惑 最近想学一门前端技术防身,看到博客园中写 vue 的多,那就 vue 吧.都说 vue 的官方教程写得好,所以我就从官方教程开始学习.官方教程说"Vue (读音 /vju?/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用."但是这个概念是个什么鬼?还是让人一头雾水嘛.而且我一开始也没有搞清楚 vue 的定位,只知道它是一个前端库,但是确实不知道它的优势是什么,还以为它是一个学会就能一劳永

SpringBootSecurity学习(12)前后端分离版之简单登录

前后端分离 前面讨论了springboot下security很多常用的功能,其它的功能建议参考官方文档学习.网页版登录的形式现在已经不是最流行的了,最流行的是前后端分离的登录方式,前端单独成为一个项目,与后台的交互,包括登录认证和授权都是由异步接口来实现.在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高.这种应用模式比较适合纯网页应用, 但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而