import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexWriter.MaxFieldLength;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import com.ole.factory.BeanFactory;
public class TestLucene {
//索引目录
public static final String INDEX_DIR=System.getProperty("user.dir")+
"/index_dir";
public static final String LUCENE_DATA=System.getProperty("user.dir")+
"/lucene_data";
private String[] columnNameArr ={"id","ordercode","incompanyname","outcompanyname",
"buydate","saledate","buygoodsnum","salegoodsnum","buyprice","saleprice",
"trucknum","empcode1","empcode2","losskg","goodscode","orderemp",
"orderdate","orderstate","batchno_out","batchno_in","ys","ss","ysye",
"yf","sf","yfye","carry_in","carry_out"};
/**
* 获取数据库数据
*/
@SuppressWarnings("unchecked")
public List<Map<String,Object>> queryOrderIO(){
BeanFactory beanFac = BeanFactory.getInstance();
IOrderIOService orderService= (IOrderIOService)beanFac.
getApplicationnContext().getBean("orderIOService");
return (List<Map<String,Object>>)orderService.queryOrderIO();
}
/**
* 创建索引
*/
public void createIndex() {
synchronized (INDEX_DIR) {
List<Map<String,Object>> resultList = queryOrderIO();
Date start=new Date();
Analyzer analyzer=new StandardAnalyzer();
try {
IndexWriter writer=new IndexWriter(INDEX_DIR,analyzer,
true,MaxFieldLength.UNLIMITED);
/***********************/
for(Map<String,Object> rowItem : resultList){
Document doc=new Document();
// Set<String> columns = rowItem.keySet();
for(String columnItem : columnNameArr){
Field fieldvalue= new Field(columnItem,
rowItem.get(columnItem)!=null?rowItem.get(columnItem).toString():"",
Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS);//Field.TermVector.NO暂不需要分词
doc.add(field_value);
}
writer.addDocument(doc);
}
writer.optimize();
writer.close();
Date end=new Date();
long indexTime=end.getTime()-start.getTime();
System.out.println("索引完成所需时间:(ms)");
System.out.println(indexTime);
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("创建索引完成!");
}
}
/**
* 跟据关键字查询
*/
public void searchIndex(String queryString,String columnName){
try{
IndexSearcher isearcher = new IndexSearcher(INDEX_DIR);
// BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD};
// TopDocCollector collector = new TopDocCollector(10000);
// QueryParser parser = new QueryParser(INDEX_DIR, new StandardAnalyzer());
// Query query = parser.parse(queryString);
Query query = new QueryParser(columnName,new StandardAnalyzer()).parse(queryString);
// MultiFieldQueryParser.parse(queryString,
// columnName, new StandardAnalyzer());
// isearcher.search(query, collector);
ScoreDoc[] hits = isearcher.search(query, isearcher.maxDoc()).scoreDocs;
System.out.println("hits.length="+hits.length);
for (int i = 0; i < hits.length; i++) {
Document doc = isearcher.doc(hits[i].doc);
for(String column : columnNameArr){
System.out.println(column+"="+doc.get(column));
}
System.out.println("=========================");
}
isearcher.close();
}catch (Exception e) {
e.printStackTrace();
}
}
// /**
// * 庖丁解牛分析器
// */
// public synchronized Analyzer getAnalyzer() {
// return new PaodingAnalyzer();
// }
public static void main(String[] args){
TestLucene testLucene = new TestLucene();
// testLucene.createIndex();
testLucene.searchIndex("2009-08-01","buydate");
// testLucene.searchIndex("ordercode","S200908040062",
// new StandardAnalyzer());
}
}
/*
* 索引域:Field是Document对象的基本组成单位,每个Field存储了实际的所有文本数据,这些文本数据在内部调用了分析器Aanlyzer的索引项结果
* Field内的检索查询最终以索引项为单位的.比索引更小的单位无法检索到
* 中文的索引项一中文分词的结果为检索单元,英文的索引项是以单词为检索单元,检索单元为最小的检索单位
* 1.public Field(String name, byte[] value, Store store)
* 2.public Field(String name, byte[] value, int offset, int length, Store store)
* 3.public Field(String name, String value, Store store, Index index)
* 4.public Field(String name, String value, Store store, Index index, TermVector termVector)
* 5.public Field(String name, Reader reader)
* 6.public Field(String name, Reader reader, TermVector termVector)
* 7.public Field(String name, TokenStream tokenStream)
* 8.public Field(String name, TokenStream tokenStream, TermVector termVector)
* 第1,2个函数用于二进制数据索引;3,4用于直接给定字符串的索引,5,6用于文件内容的索引,即Reader数据流(常用)
* name-域名为固定的参数,用于指定添加域的标识,限定检索的范围或提取属性值
* value-
* Store-控制域数据的存储,表示数据本身是否存储(注意:并不是指索引是否存储)
* 1.Store.NO 只保存索引,不包含数据本身信息,减少空间采用
* 2.Store.YES 保存索引并保存数据原始信息
* 3.Store.COMPRESS 存储并压缩原始信息
* Index-控制索引格式的参数,表示数据是否需要索引,即当前域是否需要用于检索
* 1.Index.NO 不索引,只作为辅助信息
* 2.Index.ANALYZER 2.4版本替换6
* 3.Index.NOT_ANALYZER 2.4版本替换7
* 4.Index.ANALYZER_NO_NORMS
* 5.Index.NOT_ANALYZER_NO_NOTRMS
* 6.Index.TOKENIZED 使用分词器并建立索引
* 7.Index.UN_TOKENIZED 不分词建立索引(某些内容的整体作为索引)
* 8.Index.NO_NORMS 禁用分析器处理
* TermVector-域内信息是否需要分词,在中文处理中分词是索引的基础
* TermVector保存Token.getPositionIncrement() 和Token.startOffset() 以及Token.endOffset() 信息
* 1.Field.TermVector.NO:不保存term vectors
* 2.Field.TermVector.YES:保存term vectors
* 3.Field.TermVector.WITH_POSITIONS:保存term vectors.(保存值和token位置信息)
* 4.Field.TermVector.WITH_OFFSETS:保存term vectors.(保存值和Token的offset)
* 5.Field.TermVector.WITH_POSITIONS_OFFSETS:保存term vectors.(保存值和token位置信息和Token的offset)
*/
分享到:
相关推荐
**Lucene 2.4 入门例子** Lucene 是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了强大的搜索功能,被广泛应用于各种应用中的信息检索。在这个入门例子中,我们将探讨Lucene 2.4版本的一些关键特性和...
**Lucene 2.4 完美样例与中文文档详解** Lucene 是一个高性能、全文本搜索库,由 Apache 软件基金会开发。它为开发者提供了在 Java 应用程序中实现全文检索功能的强大工具。Lucene 2.4 版本是其历史上的一个重要...
《Lucene 2.4与Nutch学习笔记:在多文本文档中搜索关键词》 Lucene是一个高性能、全文本搜索引擎库,它为开发者提供了在Java应用程序中实现全文搜索功能的基本工具。Nutch则是一个开源的网络爬虫项目,用于抓取...
《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...
例如,可以创建一个QueryParser类,处理用户输入的关键词,进行分词、分析和逻辑组合,生成相应的Query实例。 #### 2.3 搜索服务 封装搜索服务是为了提供统一的搜索接口,可以包括分页搜索、高亮显示、排序等功能...
本资源是struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0整合实例,可以为初学入门者,提供个参考,本人也是网上找的,感觉很不错(因其中所用的jar文件太大,无法上传,大家可以自己添加各框架...
- **commons-io-2.4.jar**:Apache Commons IO是Java的一个工具库,提供了大量的I/O操作辅助类,如文件读写、流操作等,对于处理Lucene的文件操作非常有用。 **使用步骤** 1. **创建索引**:首先,需要创建一个`...
4.2 案例分析:分享基于Lucene 5.4.0的搜索引擎构建实例,例如新闻网站的全文搜索、电商产品的推荐系统等。 五、未来发展趋势 5.1 版本迭代:探讨Lucene后续版本的新特性,如6.x、7.x引入的创新技术。 5.2 社区...
如果项目中需要操作文件,可能还需要commons-io-2.4.jar包。 二、创建索引: 1. 选择原始文档所在的目录和索引库要存放的目录。 2. 使用FSDirectory.open()方法打开索引库目录,创建IndexWriter对象用于写入索引...
然而,单个 Lucene 实例可能无法应对大规模的数据量,因此,将 Lucene 集成到分布式系统中,实现分布式搜索,成为了提高检索效率和可扩展性的有效解决方案。 ### 1. 引言 #### 1.1 目的 本设计说明书旨在详细阐述...
4. 创建一个Highlighter实例,设置Analyzer和Query。 5. 调用Highlighter的方法,传入原文本和匹配的Term,得到高亮后的文本片段。 6. 将高亮的文本片段返回给用户界面展示。 以上就是关于“lucune3.0 及高亮显示 ...
通过设置断点,观察类的实例化过程,跟踪方法调用,可以深入了解Lucene的实现细节。 总结,Lucene 7.4.0作为一款强大的全文搜索引擎库,其在Java开发环境中提供了高效、灵活的搜索解决方案。通过IDEA工程的集成,...
1.1 Solr的起源与发展:Solr最初由Yonik Seeley创建,后来成为Apache Lucene项目的一部分,发展至今已成为全球范围内广泛使用的搜索平台。 1.2 Solr的主要功能:Solr不仅提供全文索引,还支持多种数据类型(如日期、...
##### 2.4 索引与查询 - **索引**:通过 Hibernate Session 的 API 对实体进行增删改操作时,Hibernate Search 会自动更新 Lucene 索引。 - **查询**:可以使用 Lucene 查询语法或 Hibernate Search 提供的高级查询...
2.4 配置文件说明 主要讨论schema.xml和solrconfig.xml这两个核心配置文件的作用和配置项。 **三、Solr的应用** 3.1 SOLR应用概述 介绍Solr的应用场景和使用流程。 3.2 一个简单的例子 包括Solr Schema设计、构建...
Apache Solr 是一款开源的全文搜索引擎,基于 Lucene 库,提供了高效、可扩展的搜索和分析功能。它不仅用于网站的全文检索,还广泛应用于企业级的文档检索、商品搜索以及数据挖掘等领域。这篇博客将带你初次接触 ...
- **全文搜索**:Hibernate Search 4.2 (Apache Lucene 3.6)、IKAnalyzer 2012_u6 - **日志管理**:Log4j 1.2 这些技术的选择不仅体现了JeeSite对于稳定性和性能的追求,也反映了其对于开发便捷性和社区支持的关注...
- **2.2.4.2 单表继承**:`@DiscriminatorColumn`和`@DiscriminatorValue`用于区分子类实例。 - **2.2.4.3 子类联接**:`@Inheritance(strategy = InheritanceType.JOINED)`。 - **2.2.4.4 继承属性**:子类可以继承...