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

利用lucene创建实现全站新闻搜索

jar包:lucene-core-2.3.2.jar到相关官网下载建立线程通用类LuceneUtilimportjava.io.File;importjava.io.IOExcep

jar包:lucene-core-2.3.2.jar 到相关官网下载


//建立线程通用类LuceneUtil 

import java.io.File;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;


import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.queryParser.ParseException;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;



public class LuceneUtil implements Runnable{

private List list;

private String path;

public LuceneUtil(List list,String path){

this.list=list;

this.path=path;

}

/**

* 对数据库插叙结果List以及软路径建立索引

* @param list

*/

public void searchBuild() throws Exception {

File indexDir = new File(path);

Analyzer luceneAnalyzer = new StandardAnalyzer();

IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, true );

if(list!=null){

for(int i=0;i

Document document =   new  Document();

document.add(new Field("id", String.valueOf(list.get(i).getId()),

                        Field.Store.YES, Field.Index.NO));

document.add(new Field("title", list.get(i).getTitle(), Field.Store.YES,

                        Field.Index.TOKENIZED));

document.add(new Field("content", list.get(i).getContent(), Field.Store.YES,

                       Field.Index.TOKENIZED));

document.add(new Field("updateTime", list.get(i).getPublishTime().toString(), Field.Store.YES,

                        Field.Index.NO));

indexWriter.addDocument(document); 

}

indexWriter.optimize();   

       indexWriter.close();

}

}

    /**

     * 通过传递的内容以及路径地址进行搜索

     * @param search

     * @return

     */

public List searchList(String search,String path)throws IOException, ParseException{

List idList=new ArrayList();

Hits hitsTitle = null ;

Hits hitsCOntent= null ;

IndexSearcher searcher = new  IndexSearcher(path);

Analyzer analyzer = new  StandardAnalyzer();

QueryParser qpTitle = new  QueryParser("title", analyzer);

Query queryTitle = qpTitle.parse(search);

hitsTitle =  searcher.search(queryTitle); 

QueryParser qpCOntent= new  QueryParser("content", analyzer);

Query queryCOntent= qpContent.parse(search);

hitsCOntent= searcher.search(queryContent);

for(int i=0;i

Document doc =  hitsTitle.doc(i);

       String idi=doc.get("id" );

       Integer id=Integer.parseInt(idi);

       idList.add(id);

}

for(int i=0;i

boolean flag=true;

Document doc =  hitsContent.doc(i);

       String idi=doc.get("id" );

       Integer id=Integer.parseInt(idi);

       for(int j=0;j

        Integer idd=(Integer) idList.get(j);

        if(id==idd){

        flag=false;

        }

       }

       if(flag)

       {

       idList.add(id);

       }

}

return idList;

}

/**

* 重写run()方法实现线程建立索引

*/

public void run(){

try {

searchBuild();

} catch (Exception e) {

e.printStackTrace();

}

}

}




//service层方法

/**

* 新闻搜索

* @param search

* @return

* @throws Exception 

*/

public List searchList(String search,String path) throws Exception{

File indexDir = new File(path);

List list=new ArrayList();

List listNews=new ArrayList();

list=newsDao.searchList();

LuceneUtil luceneUtil =new LuceneUtil(list,path);

if(!indexDir.exists())

{

luceneUtil.searchBuild();

}

List listId=luceneUtil.searchList(search,path);

for(int i=0;i

int id=(Integer) listId.get(i);

NewsInfo news=newsDao.findOne(id);

listNews.add(news);

}

return listNews;

}

/**

* 查询已发表的新闻并建立索引

*/

public void buildSearch(String path){

List list=new ArrayList();

list=newsDao.searchList();

LuceneUtil luceneUtil =new LuceneUtil(list,path);

Thread thread=new Thread(luceneUtil);

thread.start();

}



//Controller层分页查询

package com.redwolfsoft.bxzk.controller.news;


import java.util.ArrayList;

import java.util.List;


import javax.servlet.http.HttpServletRequest;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.ui.Model;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;


@Controller

public class NewsSearch {

@Autowired

private NewsService newsService;

/**

* 搜索新闻

* @param search

* @param currentPageNo

* @return

*/

@RequestMapping(value="/{search}/search/{currentPageNo}/page")

public String searchNews(@PathVariable String search, @PathVariable String currentPageNo,Model model,HttpServletRequest request){

List newsList;

List pageList=new ArrayList();

StringBuffer root = new StringBuffer(request.getSession()

.getServletContext().getRealPath("/"));

root.append("indexFile");

int pageNo=1;

int current=1;

try {

newsList = newsService.searchList(search,root.toString());

int count=newsList.size();

if(count>10){

pageNo=count/10+1;

if(currentPageNo!=null && !"".equals(currentPageNo)){

current=Integer.parseInt(currentPageNo);

if(current<1){

current=1;

}

if(current>pageNo){

current=pageNo;

}

int start=(current-1)*10;

int end=current*10;

if(end>count){

end=count;

}

for(int i=start;i

pageList.add(newsList.get(i));

}

model.addAttribute("searchList", pageList);

}

}else{

model.addAttribute("searchList", newsList);

}

model.addAttribute("search", search);

model.addAttribute("pageNo", pageNo);

model.addAttribute("current", current);

} catch (Exception e) {

e.printStackTrace();

}

return "web/search/search";

}

}



//JSP页面


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<%

int max=(Integer)request.getAttribute("pageNo");

String search=(String)request.getAttribute("search");

int current=(Integer)request.getAttribute("current");

%>

 

   

          

   

 

 

目前位置:首页 - 搜索

 

   

     

       

             

           

           

             

  •            

               

             

  •          

             

             

  •  

             

               

                 

    ${news.title}

                 

    ${news.content}

               

             

  •          

           

             

           

         

 

         <上一页 

          <%for(int z=1;z<=max;z++){ %>

<%=z %>  

 <% }%>

         下一页 >

     

   

   

     

        热门标签

       

          童年阶段

          学生时代

          单身贵族

          踏入社会

          新婚燕尔

          三口之家

          财富传承

          企业团体

          车险攻略

          走进社保

       

     

     

   

 

<%@include file="../common/footer.jsp" %>

 

 


实现效果,第一次搜索的时候进行索引建立,当后台对新闻进行相关操作的时候进行线程更新索引。

本文出自 “只争朝夕” 博客,谢绝转载!

利用lucene创建实现全站新闻搜索,布布扣,bubuko.com


推荐阅读
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 深入解析Android Activity生命周期
    本文详细探讨了Android中Activity的生命周期,通过实例代码和详细的步骤说明,帮助开发者更好地理解和掌握Activity各个阶段的行为。 ... [详细]
  • Python中调用Java代码的方法与实践
    本文探讨了如何在Python环境中集成并调用Java代码,通过具体的步骤和示例展示了这一过程的技术细节。适合对跨语言编程感兴趣的开发者阅读。 ... [详细]
  • VS Code 中 .vscode 文件夹配置详解
    本文介绍了 VS Code 中 .vscode 文件夹下的配置文件及其作用,包括常用的预定义变量和三个关键配置文件:launch.json、tasks.json 和 c_cpp_properties.json。 ... [详细]
  • 本文介绍了在Android Studio中通过代码和配置文件两种方法来移除Activity的标题栏,并讨论了当Activity继承自AppCompatActivity时的特殊处理方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置单节点的Redis服务,包括下载、解压、编译安装以及启动服务的具体步骤。 ... [详细]
  • 抽象工厂模式 c++
    抽象工厂模式包含如下角色:AbstractFactory:抽象工厂ConcreteFactory:具体工厂AbstractProduct:抽象产品Product:具体产品https ... [详细]
  • 本文探讨了SQLAlchemy ORM框架中如何利用外键和关系(relationship)来建立表间联系,简化复杂的查询操作。通过示例代码详细解释了relationship的定义、使用方法及其与外键的相互作用。 ... [详细]
  • Flask中路由的基础定义与应用
    本文介绍了如何在Flask框架中通过装饰器为视图函数指定访问路径,并详细讲解了带参数路由及指定请求方法的实现方式。 ... [详细]
  • 本文详细介绍了一种实现PopupWindow全屏显示且能有效隐藏虚拟按键的技术方案,适用于Android开发。此方法经过实际测试,表现良好,兼容性优秀。 ... [详细]
  • 本文介绍了如何使用Maven命令对Spring Boot项目中的子模块进行独立打包,包括依赖树的查看、项目的运行和打包等基本操作。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 解决 Pytest 运行时出现 FileNotFoundError 的方法
    在使用 Pytest 进行测试时,可能会遇到 FileNotFoundError 错误,提示无法找到指定的文件或目录。本文将探讨该错误的原因及解决方案。 ... [详细]
  • HDU1085 捕获本·拉登!
    问题描述众所周知,本·拉登是一位臭名昭著的恐怖分子,他已失踪多年。但最近有报道称,他藏匿在中国杭州!虽然他躲在杭州的一个洞穴中不敢外出,但近年来他因无聊而沉迷于数学问题,并声称如果有人能解出他的题目,他就自首。 ... [详细]
  • SpringBoot新手入门指南
    本文旨在为初次接触SpringBoot的开发者提供一份详细的入门指导,包括如何快速搭建并运行一个简单的SpringBoot应用。通过本文,读者将了解Maven项目的构建、必要的配置文件设置以及基本的应用开发流程。 ... [详细]
author-avatar
月舞B的啊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有