- 浏览: 565460 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (478)
- lucene (45)
- oracle (19)
- nutch (2)
- blog (2)
- 垂直搜索 (19)
- java综合 (89)
- spring (15)
- Hibernate (9)
- Struts (9)
- Hadoop (16)
- Mysql (12)
- nosql (10)
- Linux (3)
- MyEclipse (4)
- Ant (1)
- 设计模式 (19)
- JBPM (1)
- JSP (1)
- HtmlParser (5)
- SVN (2)
- 插件 (2)
- 收藏 (7)
- Others (1)
- Heritrix (18)
- Solr (4)
- 主题爬虫 (31)
- 内存数据库 (24)
- 分布式与海量数据 (32)
- httpclient (14)
- Tomcat (1)
- 面试宝典 (6)
- Python (14)
- 数据挖掘 (1)
- 算法 (6)
- 其他 (4)
- JVM (12)
- Redis (18)
最新评论
-
hanjiyun:
本人水平还有待提高,进步空间很大,看这些文章给我有很大的指导作 ...
JVM的内存管理 Ⅲ -
liuxinglanyue:
四年后的自己:这种方法 不靠谱。 使用javaagent的方式 ...
计算Java对象占用内存空间的大小(对于32位虚拟机而言) -
jaysoncn:
附件在哪里啊test.NoCertificationHttps ...
使用HttpClient过程中常见的一些问题 -
231fuchenxi:
你好,有redis,memlink,mysql的测试代码吗?可 ...
MemLink 性能测试 -
guyue1015:
[color=orange][/color][size=lar ...
JAVA同步机制
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(); } }
发表评论
-
关于Lucene的讨论
2011-01-01 10:20 1065分类为[lucene]的文章 ... -
有关Lucene的问题(收藏)推荐
2010-12-30 21:02 1110有关Lucene的问题(1):为 ... -
Lucene 学习总结(收藏)推荐
2010-12-30 20:54 1563Lucene学习总结之一:全文检索的基本原理 ... -
基于Lucene的Compass 资源(收藏)
2010-12-29 18:29 11491.2、Compass相关网上资源 1、官方网站1: http ... -
Lucene 3.0.2索引文件官方文档(二)
2010-12-28 22:36 1010Deletable File A writer dy ... -
Lucene 3.0.2索引文件官方文档(一)
2010-12-28 22:34 1462Apache Lucene - Index File ... -
Lucene 3.0 索引文件学习总结(收藏)
2010-12-28 22:28 941lucene学习1——词域信息 ... -
Lucene 字符编码问题
2010-12-27 20:29 995现在如果一个txt文件中包含了ANSI编码的文本文件和Uni ... -
Lucene 字符编码问题
2010-12-27 20:20 1036现在如果一个txt文件中包含了ANSI编码的文本文件和Unic ... -
Annotated Lucene(源码剖析中文版)
2010-12-25 22:52 1266Apache Lucene是一个高性能(high-pe ... -
Lucene 学习推荐博客
2010-12-25 22:42 1035深未来deepfuturelx http://deepfut ... -
Lucene3.0 初窥 总结(收藏)
2010-12-25 22:16 1818【Lucene3.0 初窥】全文检索的基本原理 ... -
转:基于lucene实现自己的推荐引擎
2010-12-17 17:05 1058采用基于数据挖掘的 ... -
加速 lucene 的搜索速度 ImproveSearchingSpeed(二)
2010-12-17 17:01 1033本文 为简单翻译,原文在:http://wiki.apac ... -
加速 lucene 索引建立速度 ImproveIndexingSpeed
2010-12-17 16:58 1075本文 只是简单的翻译,原文 在 http://wiki.a ... -
lucene 3.0 中的demo项目部署
2010-12-15 22:02 977转自:bjqincy 1 在myEclipise 建立 ... -
Lucene 3.0.2 源码 - final class Document
2010-12-14 22:33 894package org.apache.lucene.do ... -
Lucene 3.0.2 源码 - final class Field
2010-12-14 22:29 960package org.apache.lucene.do ... -
Lucene 3.0.2 源码 - abstract class AbstractField
2010-12-14 22:28 1042package org.apache.lucene.do ... -
Lucene 3.0.2 源码 - interface Fieldable
2010-12-14 22:28 1182package org.apache.lucene.do ...
相关推荐
除了核心模块,Lucene还提供了一些附加功能,如 SpellChecker(拼写检查)、Highlighter(高亮显示搜索结果)和Remote搜索支持。在源码中,你可以找到对应的实现类,如SpellChecker、Highlighter等。 这个压缩包中...
- **Core模块**:这是Lucene的核心,包含了索引和搜索的基本功能,如`lucene-core-4.7.0.jar`。 - **Analyzer模块**:提供了各种分词器和过滤器,如`lucene-analyzers-common-4.7.0.jar`。 - **QueryParser模块**...
《深入理解Lucene 4.6.0:全方位解析索引工具》 Lucene,作为Apache软件基金会的一个开源项目,是Java平台上的一个全文检索库,它为开发人员提供了强大的文本搜索功能。Lucene 4.6.0是其发展历史中的一个重要版本,...
Apache Lucene是一个高性能、全文本搜索库,由Java编写,被广泛用于开发搜索引擎和需要文本检索功能的应用程序。Apache Lucene 4.7是该库的一个版本,它提供了丰富的功能和改进,使得开发者能够轻松地在他们的应用中...
Lucene 的核心功能之一是创建高效的索引。索引过程将文档内容转化为便于搜索的数据结构。在4.6.1版本中,Lucene 支持分词、分析和标准化,这使得搜索时能够进行模糊匹配和同义词查询。同时,它支持倒排索引,这是一...
首先,Lucene 是一个高性能、全功能的文本分析库,主要用于信息检索。它提供了索引和搜索大量文本数据的能力,包括分词、分析、存储和搜索等功能。Lucene 是纯 Java 库,可以方便地集成到各种 Java 应用中。 ...
总之,Lucene作为Java全文搜索的基石,提供了强大的功能和灵活性,可以帮助开发者构建高效、精准的搜索功能,无论是简单的关键词搜索还是复杂的模糊和智能查询,都能游刃有余地应对。结合"用户管理手册.docx"的学习...
总的来说,Lucene 是一个强大的全文搜索工具,提供了完整的搜索解决方案,涵盖了从数据索引到查询执行的全过程。对于开发人员来说,掌握 Lucene 可以帮助构建高效、灵活的搜索功能,提升用户体验。
《Lucene 3.3基础功能与IK分词器3.2.8使用详解》 Apache Lucene是一款高性能、全文本检索库,被广泛应用于各种搜索引擎的开发中。本文将重点探讨Lucene 3.3版本的基础功能及其与IK分词器3.2.8的集成使用方法。 一...
作为一个开源的搜索引擎框架,Lucene.NET为开发者提供了强大的文本搜索功能。而在处理中文文档时,由于中文词汇间的无明显空格分隔,分词成为了一个重要的环节。本文将深入探讨Lucene.NET如何进行中文分词以及高亮...
Lucene是一个高性能、全功能的全文搜索引擎库。它为开发者提供了构建搜索应用所需的工具,包括索引文档和执行查询的能力。Lucene的核心特性之一就是支持复杂的查询语言,其中包括正则表达式。 #### 正则表达式在...
它提供了一个可扩展的、高性能的搜索框架,使得开发者能够快速地在大量数据中实现全文检索功能。Lucene 已经成为了 Java 世界中事实上的搜索引擎标准,被广泛应用在网站、企业信息系统、内容管理系统等领域。 **一...
《深入理解Lucene 4.3.1:全方位解析资源与应用》 Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。在Java编程环境中,它为开发者提供了强大的文本检索功能,使得在海量数据中快速查找相关信息变...
- **定义**:Lucene是一个高性能、全功能的文本搜索引擎库,用于构建全文搜索应用程序。 - **功能**:能够快速地索引文档,并提供高效的查询机制。 - **Lucene的历史**:回顾了Lucene自1999年由Doug Cutting创建...
Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写,旨在为应用提供快速、高效的全文检索能力。它不仅仅是一个简单的索引和搜索工具,还提供了丰富的查询语言、分词器和其他高级功能。对于希望在其应用程序中...
它通过浅显的语言、大量的图注、丰富的代码示例,以及清晰的结构为读者呈现出作为优秀开源项目的Lucene 所体现的强大功能。全书共10章,分为两大部分。第1部分Lucene的核心,着重于Lucene的核心API介绍,并按照把...
在本文中,我们将深入探讨 Lucene 4.9 的核心组件和关键功能。 1. **Lucene Core 模块**: Lucene 的核心模块包括索引和搜索的主要组件。在4.9版本中,它提供了一种高效的数据结构——倒排索引,用于快速查找文档...
- **Lucene定义**:Lucene是一款高性能、全功能的文本搜索引擎库,由Java编写而成,是Apache基金会下的一个开源项目。 - **发展历程**:自1999年由Doug Cutting创建以来,Lucene已经发展成为全球最广泛使用的全文...