- 浏览: 542853 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (278)
- freemarker (6)
- flex应用 (12)
- Ext应用 (11)
- 软件 (16)
- java (61)
- 报表 (6)
- 框架基础 (6)
- 登录页面素材 (7)
- oracle (1)
- cas (10)
- lucene (6)
- linux (11)
- 视频 (10)
- springmvc (3)
- 视频服务器相关 (12)
- 开发工具 (7)
- IOS (20)
- 网站相关 (4)
- Java 任务调度系统带图形界面的 (1)
- maven (2)
- android (29)
- hadoop (3)
- SpagoBI (3)
- docx4j (4)
- 多线程 (2)
- storm (2)
- mobile 框架 (3)
- scala (1)
- socket (1)
- saiku (1)
最新评论
-
ZXCLTN:
1.streams目录,在里面放些flv,mp3之类的文件,这 ...
red5 整合到tomcat中(二) -
ZXCLTN:
写的没偷没尾的,还不如提供整个项目下载
red5 整合到tomcat中(二) -
01jiangwei01:
测试方法1:测试50个线 ...
hibernate 乐观锁 测试 -
01jiangwei01:
测试方法1:测试50个线程,同时并发访问。目标:只有一个通过, ...
hibernate 乐观锁 测试 -
xiaobadi:
你每次登陆都是跳到http://localhost:8081/ ...
cas 系统实例 服务端配置(二) 自定义登录
排序
Lucene默认按照相关度(score)排序,为了能支持其他的排序方式,比如日期,我们在add Field的时候,必须保证field被Index且不能被tokenized(分词),并且排序的只能是数字,日期,字符三种类型之一
实体类
public class Article {
private String id;
private String title;
private String keyWords;
private String content;
private int order;
省略set..get 方法
}
组织数据
import java.util.ArrayList; import java.util.List; import com.company.project.entity.Article; public class DATAUTIls { public static List<Article> luceneDatas = new ArrayList<Article>(); static { Article a1 = new Article(); a1.setContent("我们都是中国人" ); a1.setId("1"); a1.setTitle("法眼看中国是怎么样的一个中国" ) ;//有两个中国 a1.setKeyWords("中国,中国,中国") ; a1.setOrder(1); Article a2 = new Article(); a2.setContent("我们是两个中国 中国" ); a2.setId("2"); a2.setTitle("法眼看中国是怎么样的一个中国 中国" ) ;//有两个中国 a2.setKeyWords("中国,中国") ; a2.setOrder(2); Article a3 = new Article(); a3.setContent("我们都是中国人" ); a3.setId("3"); a3.setTitle("法眼看怎么样的一个中国" ) ;//有两个中国 a3.setKeyWords("中国 ") ; a3.setOrder(3); Article a4 = new Article(); a4.setContent("我们都是国中人" ); a4.setId("4"); a4.setTitle("法眼看" ) ;//有两个中国 a4.setKeyWords("无") ; a4.setOrder(4); luceneDatas.add(a1); luceneDatas.add(a3); luceneDatas.add(a2); luceneDatas.add(a4); } }
建造索引
import java.io.File; import java.io.IOException; 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.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.NRTCachingDirectory; import org.apache.lucene.util.Version; import com.company.project.entity.Article; public class IndexRunner { private String INDEX_STORe_PATH = "D:\\workplace\\company\\mylucene\\indexstore"; public IndexRunner(){}; public IndexRunner(String index_path) { this.INDEX_STORe_PATH = index_path; File dir = new File(index_path); if(dir.exists()) { dir.mkdir(); } } //创建索引 public void createIndex(List<Article> datas,boolean isCreate) throws IOException { //待创建得文档目录 Directory dir = FSDirectory.open(new File(INDEX_STORe_PATH)); //选择得分词工具 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_34); //建立索引的配置类,包含了一个解析器 IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_34, analyzer); //设置我们的解析器是新建还是追加更新 if(isCreate){ iwc.setOpenMode(OpenMode.CREATE);//每次建立都覆盖原来的索引 } else{ iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);//每次都追加更新 } NRTCachingDirectory cachedFSDir = new NRTCachingDirectory(dir, 5.0, 60.0); iwc.setMergeScheduler(cachedFSDir.getMergeScheduler()); //索引的建立类 第一个参数索引的存放位置,第二个参数索引的配置对象 IndexWriter writer = new IndexWriter(dir, iwc); for(int i=0;i<datas.size();i++) { Article article = datas.get(i ); /* * Field.Store.YES:存储字段值(未分词前的字段值) Field.Store.NO:不存储,存储与索引没有关系 * Field.Store.COMPRESS:压缩存储,用于长文本或二进制,但性能受损 Field.Index.ANALYZED:分词建索引 * Field.Index.ANALYZED_NO_NORMS:分词建索引,但是Field的值不像通常那样被保存,而是只取一个byte,这样节约存储空间 * Field.Index.NOT_ANALYZED:不分词且索引 * Field.Index.NOT_ANALYZED_NO_NORMS:不分词建索引,Field的值去一个byte保存 */ Field f0 = new Field("title", article.getTitle(), Field.Store.YES, Field.Index.ANALYZED); Field f1 = new Field("content",article.getContent(),Field.Store.YES,Field.Index.ANALYZED); Field f2 = new Field("order",String.valueOf(article.getOrder()),Field.Store.YES,Field.Index.NOT_ANALYZED); Field f3 = new Field("id",String.valueOf(article.getId()),Field.Store.YES,Field.Index.NOT_ANALYZED); Document doc = new Document(); doc.add(f0) ; doc.add(f1); doc.add(f2); doc.add(f3); writer.addDocument(doc); } //这个方法在新增索引的情况会很有用,就是讲原来散落的索引文件重新进行整理合并! // writer.forceMerge(1); writer.close(); System.out.println("索引创建成功"); } public static void main(String[] args) { IndexRunner indexRunner = new IndexRunner(); try { indexRunner.createIndex(DATAUTIls.luceneDatas,true); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
查询
此处有三种查询,一种是多字段查询一个关键字, 一种是多字段组合查询,还有一种是分页查询
import java.io.File; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Filter; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.InvalidTokenOffsetsException; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; import com.company.project.entity.Article; public class SearchRunner { private static String PATH = "D:\\workplace\\company\\mylucene\\indexstore"; public static void main(String [] arg) throws Exception{ String[] queryFileds = { "title", "content" }; String queryString = "中国"; //SearchRunner.searchList(queryFileds, queryString ); // SearchRunner.combinationSearch(); SearchRunner.pagingSearch("中", null); } /** * 在多个字段查找同一个值 */ public static void searchList(String[] queryFileds,String queryString) throws Exception { // 查询的字符串:输入不存在的字符串是查询不到的,如:中国 IndexReader reader = IndexReader.open(FSDirectory.open(new File(PATH))); IndexSearcher searcher = new IndexSearcher(reader); Query query = LuceneUtils.createQuery(queryFileds, queryString); // 在搜索器中进行查询 // 对查询内容进行过滤 Filter filter = null; // 一次在索引器查询多少条数据 int queryCount = 100; TopDocs results = searcher.search(query, filter, queryCount); System.out.println("总符合: " + results.totalHits + "条数!"); // 显示记录 for (ScoreDoc sr : results.scoreDocs) { // 文档编号 int docID = sr.doc; // 真正的内容 Document doc = searcher.doc(docID); System.out.println("inof = " + doc.get("title")); System.out.println("info2 = " + doc.get("content")); } } public static void combinationSearch() throws CorruptIndexException, IOException, ParseException{ IndexReader reader = IndexReader.open(FSDirectory.open(new File(PATH))); IndexSearcher searcher = new IndexSearcher(reader); //选择得分词工具 Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_34); QueryParser parser = new QueryParser(Version.LUCENE_34, "content", analyzer); //注意此处AND一定要大写 Query query = parser.parse("content:中 国 AND title:中 国"); // 一次在索引器查询多少条数据 int queryCount = 100; // Sort sort = new Sort(new SortField("order",SortField.DOUBLE,false)); //排序 false 升序 true降序 //TopDocs results = searcher.search(query, queryCount,sort); TopDocs results = searcher.search(query, queryCount); System.out.println("总符合: " + results.totalHits + "条数!"); // 显示记录 for (ScoreDoc sr : results.scoreDocs) { //Sort(field,true) // 文档编号 int docID = sr.doc; // 真正的内容 Document doc = searcher.doc(docID); System.out.println("id="+doc.get("id")+"\torder="+doc.get("order")+"\ttitle = " + doc.get("title")+"\tcontent = " + doc.get("content")); } } // 分页查询 public static Map pagingSearch(String title,String content) throws CorruptIndexException, IOException, ParseException, InvalidTokenOffsetsException{ Map pager = new HashMap(); List<Article> blogList=new ArrayList<Article>() ; TokenStream tokenStream=null; Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_34); //获取IndexSearcher 对象 IndexReader reader = IndexReader.open(FSDirectory.open(new File(PATH))); IndexSearcher indexSearch = new IndexSearcher(reader); QueryParser queryParser = new QueryParser(Version.LUCENE_34, "content", analyzer); //搜索条件的结合 String str=""; if(title!=null &&title.length()>0){ str="title:"+title; } if(content!=null &&content.length()>0){ if(str.trim().length()>0) { str +=" AND"; } str="content:"+content; } //设置搜索条件 Query query=queryParser.parse(str); //查询搜索引擎 TopDocs result = indexSearch.search(query, 10); //上一页的最后一个document索引 第一页为0,其余也该页的起始记录条数 int index=2; ScoreDoc scoreDoc=null; //如果当前页是第一页面scoreDoc=null。 if(index>0){ //因为索引是从0开始所以要index-1 scoreDoc=result.scoreDocs[index-1]; } //分页处理 int pageSize = 2; TopDocs hits= indexSearch.searchAfter(scoreDoc, query, pageSize); //设置分页的总记录数 //循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值 for (int i = 0; i < hits.scoreDocs.length; i++) { ScoreDoc sdoc = hits.scoreDocs[i]; Document doc = indexSearch.doc(sdoc.doc); Article article = new Article(); String stitle = doc.get("title"); String scontent = doc.get("content"); String id = doc.get("id"); //加亮处理 SimpleHTMLFormatter simplehtml=new SimpleHTMLFormatter("<font color='red'>", "</font>"); Highlighter highlighter = new Highlighter(simplehtml,new QueryScorer(query)); if(title!=null){ tokenStream = analyzer.tokenStream("title",new StringReader(title)); String highLightText = highlighter.getBestFragment(tokenStream, title); article.setTitle(highLightText==null?title:highLightText); }else { article.setTitle(stitle); } if(content!=null){ tokenStream = analyzer.tokenStream("content",new StringReader(content)); String highLightText = highlighter.getBestFragment(tokenStream, content); article.setContent(highLightText==null?title:highLightText); }else { article.setContent(scontent); } article.setId(id); System.out.println(article); blogList.add(article); } pager.put("content",hits.totalHits); pager.put("data",blogList); return pager; } }
发表评论
-
lucene 自定义排序
2012-03-26 16:34 1156索引查询或排序可参考网站:http://www.360doc. ... -
如何提高和优化Lucene搜索速度(二)
2012-03-26 09:31 1701转自网址http://hi.baidu.com ... -
如何提高和优化Lucene搜索速度(一)
2012-03-26 09:30 1298转自http://hi.baidu.com/expertsea ... -
lucene语法 lucene查询语法详解
2012-03-26 09:14 1322转自网址http://hi.baidu. ... -
web lucene
2012-01-08 18:18 946weblucene 学习。 今天在家里学习一下WebLuce ...
相关推荐
"lucene示例 demo+jar包"中提到的 jar 包是 Lucene 库的运行时依赖,它们包含了 Lucene 的所有类和方法。开发人员需要这些 jar 包来编译和运行使用 Lucene 的程序。通常,开发者会将这些 jar 文件添加到项目的类路径...
本示例将深入探讨如何在Lucene中实现facet查询,包括区间查询和多维度查询,以及关键概念——key-field-value模型。 **一、Lucene Facet的概念** Facets是信息组织的一种方法,类似于图书馆的分类标签。在搜索结果...
以下是一个基本的分页查询示例: 1. 初始化`IndexSearcher`: ```java Directory directory = FSDirectory.open(Paths.get("path/to/index")); IndexReader reader = DirectoryReader.open(directory); ...
本文将深入探讨Lucene示例中的BM25相似度计算,旨在帮助初学者理解如何利用Lucene 4.7.1版本构建索引、执行查询,并比较默认的TF-IDF相似度与BM25相似度的区别。 首先,我们需要了解什么是Lucene。Lucene是一个由...
Lucene7.4官方示例,内含若干官方实例,可用于学习Lucene
从"lucene3.0.3搜索的使用示例"中,你将学习如何编写代码来完成这些任务,包括索引创建、查询构造、搜索执行以及结果处理等。 在压缩包中的示例代码通常会涵盖这些概念,通过实际运行和调试这些代码,你可以深入...
**Lucene查询语法详解** Apache Lucene是一款高性能、全文本搜索库,被广泛应用于各种搜索引擎的构建。...在探索更多示例和实践过程中,可以参考`02_lucene_searcher`等相关资料,进一步深化理解。
通过理解和实践这个小示例,开发者可以掌握Lucene的基本用法,并在此基础上进一步探索更高级的功能,如模糊查询、短语匹配、布尔查询等。同时,源码的阅读有助于深入理解Lucene的内部工作机制,提升对全文检索的理解...
查询阶段,Lucene会使用索引来找到与用户输入查询最匹配的文档。 分词器在Lucene中扮演着关键角色。分词器是处理文本并将其拆分为有意义的单元(如单词或短语)的组件,这些单元称为“术语”或“词元”。对于中文,...
一步一步跟我学习lucene是对近期做lucene索引的总结,大家有问题的话联系本人的Q-Q: 891922381,同时本人新建Q-Q群:106570134(lucene,solr,netty,hadoop),如蒙加入,不胜感激,大家共同探讨,本人争取每日一博,...
以下是一个简单的示例代码,演示了如何使用Lucene搜索包含关键词"lucene"的文档: ```java public class TxtFileSearcher { public static void main(String[] args) throws Exception{ String queryStr = ...
Lucene是一个高性能、可扩展的信息检索库,它提供了完整的搜索功能,包括索引创建、文档存储和查询。在Lucene 6.6.2版本中,优化了性能,增强了稳定性,并对API进行了优化,使得开发者能够更高效地进行文本搜索应用...
综上所述,Lucene 示例项目提供了完整的站内搜索解决方案,涉及数据预处理、索引构建、查询执行、结果处理等多个环节。通过学习和应用此示例,开发者能够快速地在自己的Java项目中实现高效、准确的站内搜索功能。
**Lucene入门示例** Lucene是一个开源的全文搜索引擎库,由Apache软件基金会开发并维护。它提供了文本分析、索引创建、文档检索等核心功能,广泛应用于各种搜索应用的开发。本文将从一个简单的Lucene入门示例出发,...
这个“lucene 3.0 java示例”压缩包提供了一个具体的实例,演示如何在Java应用程序中使用Lucene 3.0版本来查询数据库。 在Lucene中,主要涉及以下几个核心概念: 1. **索引**:Lucene通过构建索引来提高搜索效率。...
在“Lucene40Demo”这个示例中,我们可以看到以下关键步骤: 1. 创建索引:首先,我们需要创建一个IndexWriter对象,配置好目录(Directory)和Analyzer,然后逐个添加Document到索引中。 2. 分析文本:使用...
本文主要介绍了一个将Lucene搜索引擎与数据库(MySQL)结合的示例,用于实现文本检索功能。Lucene是Apache软件基金会的开源全文检索库,它提供了强大的文本分析和索引构建能力。在本示例中,作者使用Spring和Struts1...
本话题聚焦于“Lucene多字段查询”和“文字高亮显示”,这两个特性在信息检索和数据挖掘中具有广泛应用。 首先,让我们深入理解“Lucene多字段查询”。在信息检索系统中,用户可能希望根据多个字段来过滤和排序结果...