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

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<NewsInfo> list;

private String path;

public LuceneUtil(List<NewsInfo> 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<list.size();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<hitsTitle.length();i++){

Document doc =  hitsTitle.doc(i);

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

Integer id=Integer.parseInt(idi);

idList.add(id);

}

for(int i=0;i<hitsContent.length();i++){

boolean flag=true;

Document doc =  hitsContent.doc(i);

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

Integer id=Integer.parseInt(idi);

for(int j=0;j<idList.size();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<NewsInfo> searchList(String search,String path) throws Exception{

File indexDir = new File(path);

List<NewsInfo> list=new ArrayList<NewsInfo>();

List<NewsInfo> listNews=new ArrayList<NewsInfo>();

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<listId.size();i++){

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

NewsInfo news=newsDao.findOne(id);

listNews.add(news);

}

return listNews;

}

/**

*

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

*/

public void buildSearch(String path){

List<NewsInfo> list=new ArrayList<NewsInfo>();

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<NewsInfo> newsList;

List<NewsInfo> pageList=new ArrayList<NewsInfo>();

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<end;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");

%>

<!DOCTYPE HTML>

<html>

<head>

<base href="<%=basePath%>">

<title></title>

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<script type="text/javascript" src="include/common.js.jsp"></script>

</head>

<body>

<div id="header">

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

</div>

<div class="wra">

<div class="now_position">目前位置:<a href="index">首页</a> - 搜索</div>

<div class="content">

<div class="content_L">

<div class="news_list" >

<ul>

<c:forEach var="news" items="${searchList}" varStatus="status">

<c:choose>

<c:when test="${news.image==null||news.image==‘‘}">

<li>

<div class="tit"> <a href="newsInfo/${news.id}" target="_blank">${news.title}</a> </div>

<div class="con"> <a href="newsInfo/${news.id}" target="_blank">${news.content}</a> </div>

</li>

</c:when>

<c:otherwise>

<li>

<a href="newsInfo/${news.id}" target="_blank"> <img src="${news.image}" /></a>

<dl>

<dt> <a href="newsInfo/${news.id}" target="_blank">${news.title}</a> </dt>

<dd> <a href="newsInfo/${news.id}" target="_blank"> ${news.content}</a></dd>

</dl>

</li>

</c:otherwise>

</c:choose>

</c:forEach>

</ul>

<div class="paging">

<a href="<%=search %>/search/<%=current-1 %>/page"><上一页</a>

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

<a href="<%=search %>/search/<%=z %>/page"><%=z %></a>&nbsp;&nbsp;

<% }%>

<a href="<%=search %>/search/<%=current+1 %>/page">下一页 ></a> </div>

</div>

</div>

<div class="content_R">

<div class="hot_tag_1">

<strong>热门标签</strong>

<p>

<a href="guide/1" target="_blank" class="hot_co_1">童年阶段</a>

<a href="guide/2" target="_blank" class="hot_co_2">学生时代</a>

<a href="guide/3" target="_blank" class="hot_co_3">单身贵族</a>

<a href="guide/4" target="_blank" class="hot_co_3">踏入社会</a>

<a href="guide/5" target="_blank" class="hot_co_4">新婚燕尔</a>

<a href="guide/6" target="_blank" class="hot_co_5">三口之家</a>

<a href="guide/7" target="_blank" class="hot_co_6">财富传承</a>

<a href="guide/8" target="_blank" class="hot_co_7">企业团体</a>

<a href="guide/9" target="_blank" class="hot_co_3">车险攻略</a>

<a href="guide/10" target="_blank" class="hot_co_4">走进社保</a>

</p>

</div>

<div class="s_ad_1" id="s_ad_1"></div>

</div>

</div>

</div>

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

</body>

<script type="text/javascript" src="js/view/web/common/right_picture.js"></script>

</html>

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

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

时间: 2024-12-25 17:13:24

利用lucene创建实现全站新闻搜索的相关文章

lucene创建index和搜索

package com.my.lucene.index; import java.io.File; import java.io.FileReader; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field;

搜索引擎系列 ---lucene简介 创建索引和搜索初步

一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 :Lucene得名于Doug妻子的中名,同时这也她外祖母的姓;目前是Apache基金会的一个顶级项目,同时也是学习搜索引擎入门必知必会. Lucene 是一个 JAVA 搜索类库,它本身并不是一个完整的解决方案,需要额外的开发工作. 优点:成熟的解决方案,有很多的成功案例.apache 顶级项目,正在持续快速的进步.庞大而活跃的开

搜索引擎系列 -lucene简介 创建索引和搜索初步步骤

一.什么是Lucene? Lucene最初是由Doug Cutting开发的,2000年3月,发布第一个版本,是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎 :Lucene得名于Doug妻子的中名,同时这也她外祖母的姓;目前是Apache基金会的一个顶级项目,同时也是学习搜索引擎入门必知必会. Lucene 是一个 JAVA 搜索类库,它本身并不是一个完整的解决方案,需要额外的开发工作. 优点:成熟的解决方案,有很多的成功案例.apache 顶级项目,正在持续快速的进步.庞大而活跃的开

创建一个提供搜索功能的搜索类(可运行)

/* * 这段代码的主要功能是对于创建索引的后的文件, * 创建一个提供搜索功能的搜索类. * */ package ch2.lucenedemo.process; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Date; import java.util.Iterator; import jav

创建一个提供搜索功能来搜索类(可执行文件)

/* * 这段代码的主要功能是后创建文件的索引. * 创建一个提供搜索功能来搜索类. * */ package ch2.lucenedemo.process; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Date; import java.util.Iterator; import java.u

创建索引和搜索

package cn.dyg.luence; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexW

记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索

实现效果: 上一篇文章有附全文搜索结果的设计图,下面截一张开发完成上线后的实图: 基本风格是模仿的百度搜索结果,绿色的分页略显小清新. 目前已采集并创建索引的文章约3W多篇,索引文件不算太大,查询速度非常棒. 刀不磨要生锈,人不学要落后.每天都要学一些新东西. 基本技术介绍: 还记得上一次做全文搜索是在2013年,主要核心设计与代码均是当时的架构师写的,自己只能算是全程参与. 当时使用的是经典搭配:盘古分词+Lucene.net. 前几篇文章有说到,盘古分词已经很多年不更新了,我在Support

Lucene.Net 站内搜索

Lucene.Net 站内搜索 一  全文检索: like查询是全表扫描(为性能杀手)Lucene.Net搜索引擎,开源,而sql搜索引擎是收费的Lucene.Net只是一个全文检索开发包(只是帮我们存数据取数据,并没有界面,可以看作一个数据库,只能对文本信息进行检索)Lucene.Net原理:把文本切词保存,然后根据词汇表的页来找到文章 二  分词算法: //一元分词算法(引用Lucene.Net.dll)  一元分词算法 //二元分词算法(CJK:China Japan Korean 需要再

初识Lucene 4.5全文搜索

近期想研究下lucene,但网络上的教程大多都是lucne 3.x版本的讲解.可是lucene版本的更新速度快的惊人,目前已经到了4.8版了,只好去查阅官方文档.虽然英文不大好,但稍微对比了下发现3.x版本至4.x版本的修改非常之大.接下来我就以4.5版来操作,分享下我对luence的初步认识. 先给大家看一张图(来至<Lucene  in  action>): 此图很形象的描述了lucene的基本流程,简而言之就是:1.创建索引:2.检索索引. 太深的道理与原理我目前也还是一知半解,所以就以