- 浏览: 162033 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
liuxuejin:
不知道 这个代码能否用于C版的GearMan??
gearman Java Client -
dacoolbaby:
转帖的意思很简单,就是转行,太累干不下去了。积累了5年的经验转 ...
告别程序员生涯,一点感慨,与诸君共勉(转) -
xiaoyun3982116:
代码准确率再高点就很好了
java常用排序算法总结<二>【转】 -
liaowe:
同意,真乃神人
低调的818一年半来常读的书 -
babyke:
兄弟,你一年半读了这么多书?神人也!
低调的818一年半来常读的书
package com.diyi.util;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
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.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.RangeQuery;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.mira.lucene.analysis.IK_CAnalyzer;
import com.diyi.core.web.BaseAction;
public class LuceneTest extends BaseAction{
private static final long serialVersionUID = 1L;
/*
* lucene全功能,几乎包含了大部分查询综合起来。,
*/
static String path="e:\\Lucene测试\\";
static String ArticleTitle="ArticleTitle";
static String ArticleText="ArticleText";
static String ArticleTime="ArticleTime";
public static void index() throws Exception {
/* 创建索引初始化,执行这些语句将创建或清空d:\\save\\目录下所有索引 */
File file=new File(path);
if(file.isDirectory())
{
file.delete();
}
IK_CAnalyzer ikAnalyzer=new IK_CAnalyzer();
IndexWriter writer1 = new IndexWriter(path,ikAnalyzer, true);
writer1.close();
// IndexReader indexReader=IndexReader.open(path);
// indexReader.deleteDocument(1);
/*
* 往创建的初始化索引中添加索引内容,StandardAnalyzer表示用lucene自带的标准分词机制,
* false表示不覆盖原来该目录的索引,细心的读者可能已经发现, 这句话和上面的那句就这个false不一样
*/
IndexWriter writer2 = new IndexWriter(path,
ikAnalyzer, false);
/* 创建一份文件 */
Document doc1 = new Document();
/*
* 创建一个域ArticleTitle,并往这个域里面添加内容 "Field.Store.YES"表示域里面的内容将被存储到索引
* "Field.Index.TOKENIZED"表示域里面的内容将被索引,以便用来搜索
* Lucene给文档的字段设定三个布尔变量: 索引(indexed), 存储(stored), 切词(tokenized) ,
*/
Field field1 = new Field(ArticleTitle, "上海2010年世博会,hot,GOOGLE和Yahoo 赞助,test,中华人民共和国万岁", Field.Store.YES,
Field.Index.TOKENIZED);
/* 往文件里添加这个域 */
doc1.add(field1);
/* 同理:创建另外一个域ArticleText,并往这个域里面添加内容 */
Field field2 = new Field(ArticleText, "这是一届创造绿色环境,点燃激情,影响深远的博览会....god..Hotmail,text,foam,OpenOffica",
Field.Store.YES, Field.Index.TOKENIZED);
doc1.add(field2);
Field field3 = new Field(ArticleTime, "2009",
Field.Store.YES, Field.Index.TOKENIZED);
doc1.add(field3);
// 在这里还可以添加其他域
/* 添加这份文件到索引 */
writer2.addDocument(doc1);
/* 同理:创建第二份文件 */
Document doc2 = new Document();
field1 = new Field(ArticleTitle, "中国获得全球赞誉,世界人民大团结万岁,text", Field.Store.YES,
Field.Index.TOKENIZED);
doc2.add(field1);
field2 = new Field(ArticleText, "中国上海世博馆雄踞东方,傲视全球........,roams,OpenOffice",
Field.Store.YES, Field.Index.TOKENIZED);
doc2.add(field2);
field3 = new Field(ArticleTime, "2010",
Field.Store.YES, Field.Index.TOKENIZED);
doc2.add(field3);
/*
*
*
*/
writer2.addDocument(doc2);
// 在这里可以添加其他文件
//writer2.optimize();
/* 关闭 */
writer2.close();
}
public String searchIndex() throws Exception {
LuceneTest.index();
String keywords=getRequest().getParameter("serchString");
/* 创建一个搜索,搜索刚才创建的目录下的索引 */
IndexSearcher indexSearcher = new IndexSearcher(path);
/* 在这里我们只需要搜索一个目录 */
IndexSearcher indexSearchers[] = { indexSearcher };
/* 我们需要搜索两个域ArticleTitle, ArticleText里面的内容 */
String[] fields = {ArticleTitle,
ArticleText ,ArticleTime};
/* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行
BooleanClause.Occur[]数组,它表示多个条件之间的关系,BooleanClause.Occur.MUST表示and,
BooleanClause.Occur.MUST_NOT表示not,BooleanClause.Occur.SHOULD表示or.
1、MUST和MUST表示“与”的关系,即“并集”。
2、MUST和MUST_NOT前者包含后者不包含。
3、MUST_NOT和MUST_NOT没意义
4、SHOULD与MUST表示MUST,SHOULD失去意义;
5、SHOUlD与MUST_NOT相当于MUST与MUST_NOT。
6、SHOULD与SHOULD表示“或”的概念*/
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,
BooleanClause.Occur.SHOULD,BooleanClause.Occur.SHOULD};
/*
* MultiFieldQueryParser表示多个域解析,
* 同时可以解析含空格的字符串,如果我们搜索"上海 中国"
*/
Analyzer analyzer=new IK_CAnalyzer();
Query multiFieldQuery = MultiFieldQueryParser.parse(keywords, fields, clauses,
analyzer);
Query termQuery= new TermQuery(new Term(ArticleTitle, keywords));//词语搜索,完全匹配,搜索具体的域
Query wildqQuery=new WildcardQuery(new Term(ArticleTitle,keywords));//通配符查询
Query prefixQuery=new PrefixQuery(new Term(ArticleText,keywords));//字段前缀搜索
Query fuzzyQuery=new FuzzyQuery(new Term(ArticleText,keywords));//相似度查询,模糊查询比如OpenOffica,OpenOffice
Query rangQuery=new RangeQuery(new Term(ArticleTime,keywords), new Term(ArticleTime,keywords), true);//数字范围查询
/* Multisearcher表示多目录搜索,在这里我们只有一个目录 */
MultiSearcher searcher = new MultiSearcher(indexSearchers);
//多条件搜索
BooleanQuery multiQuery=new BooleanQuery();
multiQuery.add(wildqQuery, BooleanClause.Occur.SHOULD);
multiQuery.add(multiFieldQuery, BooleanClause.Occur.SHOULD);
multiQuery.add(termQuery, BooleanClause.Occur.SHOULD);
multiQuery.add(prefixQuery, BooleanClause.Occur.SHOULD);
multiQuery.add(fuzzyQuery, BooleanClause.Occur.SHOULD);
multiQuery.add(rangQuery, BooleanClause.Occur.SHOULD);
Sort sort=new Sort(ArticleTime);//排序
/* 开始搜索 */
Hits h = searcher.search(multiQuery,sort);
String highTitle="";
String highText="";
List<String> list=new ArrayList<String>();
/* 把搜索出来的所有文件打印出来 */
for (int i = 0; i < h.length(); i++) {
//打印出文件里面ArticleTitle域里面的内容
String title=h.doc(i).get(ArticleTitle);
// 打印出文件里面ArticleText域里面的内容
String text=h.doc(i).get(ArticleText);
SimpleHTMLFormatter format=new SimpleHTMLFormatter("<b><font color='red'>","</font></b>");
Highlighter light=new Highlighter(format, new QueryScorer(multiQuery));//高亮
light.setTextFragmenter(new SimpleFragmenter(200));
if(title!=null)
{
TokenStream stream=analyzer.tokenStream(ArticleTitle, new StringReader(title));
highTitle=light.getBestFragment(stream, title);
System.out.println(highTitle);
}
if(text!=null)
{
TokenStream streamText=analyzer.tokenStream(ArticleText, new StringReader(text));
highText=light.getBestFragment(streamText, text);
System.out.println(highText);
}
//为了在页面好遍历,把它放入集合中
if(highTitle!=null)
{
list.add("标题中包含关键字:"+highTitle+"<br/>");
}
if(highText!=null)
{
list.add("内容中包含关键字:"+highText+"<br/>");
}
}
getRequest().setAttribute("list",list);
/* 关闭 */
searcher.close();
return SUCCESS;
}
public String goToSearch()
{
return SUCCESS;
}
// 通配符搜索 WildcardQuery
// 通配符包括’?’匹配一个任意字符和’*’匹配零个或多个任意字符,例如你搜索’use*’,你可能找到’user’或者’uses’:
public static void wildcardSearcher() throws Exception{
index();
IndexSearcher searcher = new IndexSearcher(path);
// 与正则一样,*代表0个或多个字母,?代表0个或一个字母
// WildcardQuery与QueryParser不同的是:WildcardQuery的前缀可以为*,而QueryParser不行
Query query = new WildcardQuery(new Term(ArticleText,"te*"));
Hits hits = searcher.search(query);
printResult(hits);
searcher.close();
}
public static void printResult(Hits hits) throws IOException{
for(int i = 0; i < hits.length(); i++){
Document d = hits.doc(i);
String title=d.get(ArticleTitle);
String text=d.get(ArticleText);
String time=d.get(ArticleTime);
if(title!=null)
{
System.out.println(title);
}
if(text!=null)
{
System.out.println(text);
}
if(time!=null)
{
System.out.println(time);
}
}
}
public static void main(String[] args) throws Exception {
LuceneTest test=new LuceneTest();
test.wildcardSearcher();
LuceneTest .searchIndex();
}
}
发表评论
-
Apache Mahout中的机器学习算法集【转】
2011-11-02 23:04 2574Apache Mahout 是 ApacheSoftw ... -
基于 Apache Mahout 构建社会化推荐引擎【转】
2011-11-02 11:35 1576推荐引擎简介 推荐 ... -
lucene各大版本变化总览
2011-09-27 13:42 21543.5 该版本进行了大量优化、改进和Bug修复,包括: ... -
MySQL向Hive/HBase的迁移工具
2011-04-21 10:34 1492Apache Hive是目前大型数据仓库的免费首选产品之一,使 ... -
使用Jsoup爬取互联网信息
2010-09-14 15:42 2944public static void parserURLsBy ... -
使用Jsoup 过滤HTML
2010-09-14 15:40 3845我们在解析HTML 或者爬取网页信息时,一般使用htmlpa ... -
The Future of Compass & ElasticSearch
2010-09-14 15:27 1346此篇文章,作者向大家解释了好久不更新Compas ... -
常用开源搜索引擎工具
2010-05-09 13:28 1503以下为个人整理,当然 ... -
数据挖掘技术的算法与应用【转】
2010-04-14 13:32 2778研究方向前沿读书报告 数据挖掘技术的算法与应用 目录 ... -
搜索引擎核心技术揭密中文分词【转】
2010-04-04 22:51 1185搜索引擎技术的研究 ...
相关推荐
它通过浅显的语言、大量的图注、丰富的代码示例,以及清晰的结构为读者呈现出作为优秀开源项目的Lucene 所体现的强大功能。全书共10章,分为两大部分。第1部分Lucene的核心,着重于Lucene的核心API介绍,并按照把...
本书深入浅出地介绍了lucene 一个开源的使用java语言编写的全文搜索引擎开发包 它通过浅显的语言 大量的图注 丰富的代码示例 以及清晰的结构为读者呈现出作为优秀开源项目的lucene所体现的强大功能 全书共10章 分为...
它通过浅显的语言、大量的图注、丰富的代码示例,以及清晰的结构为读者呈现出作为优秀开源项目的Lucene所体现的强大功能。全书共10章,分为两大部分。第1部分Lucene的核心,着重于Lucene的核心 API介绍,并按照把...
4.最新新闻系统已增加伪静态与全站生成静态功能。 5.支持上亿级数据的全文查询,时间在毫秒级,通常在30毫秒以下; 6.新闻系统与搜索引擎测试地址 垂直搜索 垂直搜索引擎和普通的网页搜索引擎的最大区别是对网页...
它通过浅显的语言、大量的图注、丰富的代码示例,以及清晰的结构为读者呈现出作为优秀开源项目的Lucene所体现的强大功能。全书共10章,分为两大部分。第1部分Lucene的核心,着重于Lucene的核心API介绍,并按照把...
Apache Lucene是用Java编写的高性能,功能齐全的文本搜索引擎库。 在线文件 此自述文件仅包含基本的安装说明。 有关更全面的文档,请访问: Lucene: : 用Gradle构建 基本步骤: 安装OpenJDK 11(或更高版本) ...
Lucene ++是流行的Java 库的C ++端口,Java 库是一种高性能,功能齐全的文本搜索引擎。 Lucene ++组件 liblucene ++库 liblucene ++-contrib库 lucene ++-tester(单元测试器) deletefiles(演示) 索引文件...
使用visual studio 开发的lucene.net...并实现了高亮功能。高亮上使用的是盘古分词的高亮算法。 有点小bug,在这个字段没有关键字的时候可能会不显示数据, 如果要是只看全文检索,可以自己去掉高亮,看一下检索结果。
Apache Lucene是用Java编写的高性能,功能齐全的文本搜索引擎库。 Apache Solr是使用Java编写并使用Apache Lucene的企业搜索平台。 主要功能包括全文搜索,索引复制和分片以及结果分面和突出显示。 在线文件 该...
本项目旨在通过Lucene库的强大功能,实现一个高效、精准的搜索引擎。该引擎能够对海量文档进行快速索引和检索,提供全文搜索、关键词高亮显示、多条件过滤等实用功能。同时,系统支持用户自定义搜索规则,满足不同...
先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是, Lucene非常复杂,你需要深入了解检索的相关知识来理解它是...
该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 一. 技术组成 技术栈:Java,使用 jdk1.8 即可 开发环境:IDEA /Ecplise 数据库:MySql (如果有的话) 二. 部署说明 1. Java...
该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:Vue/JSP/React/HTML+JS+CSS/ASP 后台框架代码:java/c/c++/...
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要发挥其强大的作用,你需...
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。 但是,Lucene只是一个库。想要发挥其强大的作用,你...
该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:Vue/JSP/React/HTML+JS+CSS/ASP 后台框架代码:java/c/c++/...
SSM框架学习宝典:入门、进阶、精通,全方位代码项目资 一、探索SSM的无限可能 SSM(Spring + Spring MVC + MyBatis)框架作为Java开发中的黄金组合,为开发者提供了强大的技术支持和丰富的功能。本系列资料将带您...
Lucene 可能是目前存在的,不论开源还是私有的,拥有最先进,高性能和全功能搜索引擎功能的库。但是 Lucene 仅仅只是一个库。为了利用它,你需要编写 Java 程序,并在你的 java 程序里面直接集成 Lucene 包。 更坏...
对于学生而言,它提供了从初步的构想到实际开发所需的全方位辅助材料,包括论文、设计文档和源代码等。 2. 包含内容: - 论文:涵盖了整个Java ASP Web系统的基础知识,设计意图、需求概述、系统结构与设计哲学、...