Lucene(01)
我的博客园博文地址:http://www.cnblogs.com/tenglongwentian/
Lucene,最新版是Lucene6.2.1,匹配的jdk版本是1.8正式版。
这里用jdk7最后一版,所以用Lucene5.3.3。
新建一个maven项目,如果不会可以参考前面的博文,前面的博文有专门提到如何新建maven项目。
新建的maven项目:<packaging>jar</packaging>,
- <dependencies>
- <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core -->
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-core</artifactId>
- <version>5.5.3</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser -->
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-queryparser</artifactId>
- <version>5.5.3</version>
- </dependency>
- <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common -->
- <dependency>
- <groupId>org.apache.lucene</groupId>
- <artifactId>lucene-analyzers-common</artifactId>
- <version>5.5.3</version>
- </dependency>
- </dependencies>
因为我用jdk7,不喜欢每次更新maven仓库都要手动调整项目的jdk版本,所以
- <!-- 源码目录,插件管理等配置 -->
- <build>
- <finalName>Lucene</finalName>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.3</version>
- <configuration>
- <!-- 指定source和target的版本 -->
- <!-- source 指定用哪个版本的编译器对java源码进行编译 -->
- <source>1.7</source>
- <!-- target 指定生成的class文件将保证和哪个版本的虚拟机进行兼容 -->
- <target>1.7</target>
- </configuration>
- </plugin>
- </plugins>
- </build>
可以这样。
新建两个类:
Indexer
- import java.io.File;
- import java.io.FileReader;
- import java.nio.file.Paths;
- 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.document.TextField;
- import org.apache.lucene.index.IndexWriter;
- import org.apache.lucene.index.IndexWriterConfig;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.FSDirectory;
- public class Indexer {
- private IndexWriter writer;// 写索引实例
- /**
- * 构造方法实例化IndexWriter
- *
- * @param indexDir
- * @throws Exception
- */
- public Indexer(String indexDir) throws Exception {
- Directory dir = FSDirectory.open(Paths.get(indexDir));
- Analyzer analyzer = new StandardAnalyzer();// 标准分词器
- IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
- writer = new IndexWriter(dir, iwc);
- }
- /**
- * 关闭写索引
- *
- * @throws Exception
- */
- public void close() throws Exception {
- writer.close();
- }
- /**
- * 索引指定目录的所有文件
- *
- * @param dataDir
- * @throws Exception
- */
- public int index(String dataDir) throws Exception {
- File[] files = new File(dataDir).listFiles();
- for (File f : files) {
- indexFile(f);
- }
- return writer.numDocs();
- }
- /**
- * 索引指定文件
- *
- * @param f
- */
- private void indexFile(File f) throws Exception {
- // TODO Auto-generated method stub
- System.out.println("索引文件:" + f.getCanonicalFile());
- Document doc = getDocument(f);
- writer.addDocument(doc);
- }
- /**
- * 获取文档,文档里在设置每个字段
- *
- * @param f
- * @return
- * @throws Exception
- */
- private Document getDocument(File f) throws Exception {
- // TODO Auto-generated method stub
- Document doc = new Document();
- doc.add(new TextField("contents", new FileReader(f)));
- doc.add(new TextField("fileName", f.getName(), Field.Store.YES));
- doc.add(new TextField("fullPath", f.getCanonicalPath(), Field.Store.YES));
- return doc;
- }
- public static void main(String[] args){
- String indexDir="E:\\lucene";
- String dataDir="E:\\lucene\\data";
- Indexer indexer = null;
- int numIndexed=0;
- long start=System.currentTimeMillis();
- try {
- indexer = new Indexer(indexDir);
- numIndexed=indexer.index(dataDir);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally {
- try {
- indexer.close();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- long end=System.currentTimeMillis();
- System.out.println("索引:"+numIndexed+"个文件,花费了"+(end-start)+"毫秒");
- }
- }
- String indexDir="E:\\lucene";
- String dataDir="E:\\lucene\\data";
看到这里不要好奇,盘符随意,在任意盘符根目录下新建文件夹,最好英文无空格,中文未测试,然后拷贝几个txt文件到data文件夹下面,一会测试用的到。
然后运行这个类,可以看到
- 然后可以在lucene文件夹下看到这几个奇怪的文件,是什么后面会提到,稍安勿躁。
新建另一个类:
Searcher
- import java.nio.file.Paths;
- import org.apache.lucene.analysis.Analyzer;
- import org.apache.lucene.analysis.standard.StandardAnalyzer;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.index.DirectoryReader;
- import org.apache.lucene.index.IndexReader;
- import org.apache.lucene.queryparser.classic.QueryParser;
- 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.store.Directory;
- import org.apache.lucene.store.FSDirectory;
- public class Searcher {
- public static void search(String indexDir, String q) throws Exception {
- Directory dir = FSDirectory.open(Paths.get(indexDir));
- IndexReader reader = DirectoryReader.open(dir);
- IndexSearcher is = new IndexSearcher(reader);
- Analyzer analyzer = new StandardAnalyzer();
- QueryParser parse = new QueryParser("contents", analyzer);
- Query query = parse.parse(q);
- long start = System.currentTimeMillis();
- TopDocs hits = is.search(query, 10);
- long end = System.currentTimeMillis();
- System.out.println("匹配" + q + ",总共花费" + (end - start) + "毫秒," + "查询到" + hits.totalHits + "个记录");
- for (ScoreDoc scoreDoc : hits.scoreDocs) {
- Document doc = is.doc(scoreDoc.doc);
- System.out.println(doc.get("fullPath"));
- }
- reader.close();
- }
- public static void main(String[] args) {
- String indexDir = "E:\\lucene";
- //String q = "LICENSE-2.0";
- String q = "Zygmunt Saloni";
- try {
- search(indexDir, q);
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
运行这个类,
不要把第一个类生成的几个特殊的文件删除,任性的话,试试看,会报错,如果删除运行第一个类生成的几个特殊的奇怪文件后再运行第二个类的时候会报错。
还是任性的试试看吧。
对比String q = "Zygmunt Saloni";事实证明没什么影响,因为分词了,整体切割。
加上-运行第二个类的话,结果一样,自己试试看。
转载请注明出处,谢谢。
Lucene(01)的更多相关文章
- Lucene 01 - 初步认识全文检索和Lucene
目录 1 搜索简介 1.1 搜索实现方案 1.2 数据查询方法 1.2.1 顺序扫描法 1.2.2 倒排索引法(反向索引) 1.3 搜索技术应用场景 2 Lucene简介 2.1 Lucene是什么 ...
- lucene&solr-day1
全文检索课程 Lucene&Solr(1) 1. 计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) ...
- ES 01 - Elasticsearch入门 + 基础概念学习
目录 1 Elasticsearch概述 1.1 Elasticsearch是什么 1.2 Elasticsearch的优点 1.3 Elasticsearch的相关产品 1.4 Elasticsea ...
- JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理
1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ...
- 全文搜索技术—Lucene
1. 内容安排 实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来.还可以根据中文词语进程查询,并且支持多种条件查询. 本案例中的原始内容就是磁盘上的文件 ...
- Elasticsearch入门 + 基础概念学习
原文地址:https://www.cnblogs.com/shoufeng/p/9887327.html 目录 1 Elasticsearch概述 1.1 Elasticsearch是什么 1.2 E ...
- Lucene.Net简单例子-01
前面已经简单介绍了Lucene.Net,下面来看一个实际的例子 1.1 引用必要的bll文件.这里不再介绍(Lucene.Net PanGu PanGu.HightLight PanGu.Luc ...
- 01 lucene基础 北风网项目培训 Lucene实践课程 索引
在创建索引的过程中IndexWriter会创建多个对应的Segment,这个Segment就是对应一个实体的索引段.随着索引的创建,Segment会慢慢的变大.为了提高索引的效率,IndexWrite ...
- 01 lucene基础 北风网项目培训 Lucene实践课程 系统架构
Lucene在搜索的时候数据源可以是文件系统,数据库,web等等. Lucene的搜索是基于索引,Lucene是基于前面建立的索引之上进行搜索的. 使用Lucene就像使用普通的数据库一样. Luce ...
随机推荐
- 爱上MVC~MVC4模型验证可以放在前端
回到目录 MVC4.0推出后,在模型验证上有了一个新的改近,它支持前端验证,即在用户POST之前,如果验证失败,则Action(POST方式的)不会被执行,而直接停留在原视图,这对于用户体验是好的,它 ...
- AngularJS 源码分析1
AngularJS简介 angularjs 是google出品的一款MVVM前端框架,包含一个精简的类jquery库,创新的开发了以指令的方式来组件化前端开发,可以去它的官网看看,请戳这里 再贴上一个 ...
- Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt
Atitit 代理与分销系统(1) 子代理 充值总额功能设计概览 sum() groubpy subagt Keyword 分组与聚合操作. 一个for做分组...里面的做聚合... 数据g操作查 ...
- ASP.NET MVC 异常Exception拦截器Fillter
异常信息的处理在程序中非常重要, 在asp.net mvc中提供异常属性拦截器进行对异常信息的处理,异常拦截器也没有什么的,只是写一个类,继承另一个类(System.Web.Mvc.FilterAtt ...
- Python之文件读写
本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...
- CentOS 下运维自动化 Shell 脚本之 expect
CentOS 下运维自动化 Shell脚本之expect 一.预备知识: 1.在 Terminal 中反斜杠,即 "" 代表转义符,或称逃脱符.("echo -e与pri ...
- MySQL(四) 数据表的插入、更新、删除数据
序言 数据表的插入.更新.删除非常简单,但是简单的也要学习,细节决定成败. ---WH 一.插入数据 格式:INSERT INTO 表名(字段名...)VALUES(值...); 创建环境 使用per ...
- javascript基础语法——表达式
× 目录 [1]原始表达式 [2]复杂表达式 前面的话 一般地,关于javascript基础语法,人们听得比较多的术语是操作符和语句.但是,其实还有一个术语经常使用,却很少被提到,这就是javascr ...
- struts深入理解之登录示例的源码跟踪
废话不多,直接上图:(色泽比较重的是追踪的路径)
- 用Log Parser Studio分析IIS日志
发现一个强大的图形化IIS日志分析工具——Log Parser Studio,下面分享一个实际操作案例. 1. 安装Log Parser Studio a) 需要先安装Log Parser,下载地址: ...