1.Maven Dependency
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>Lucene3.6</groupId> <artifactId>Lucene3.6</artifactId> <version>1</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <lucene-version>3.6.2</lucene-version> <junit-version>4.11</junit-version> </properties> <dependencies> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>${lucene-version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit-version}</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> </dependencies> <build> <sourceDirectory>src</sourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> </plugins> </build> </project>
2.全文搜索
分为三部分:
索引
1、创建Directory
2、创建IndexWriter
3、创建Document对象
4、为Document对象添加Field
5、通过IndexWriter添加文档到索引中
分词
搜索
1、创建Directory
2、创建IndexReader
3、根据IndexReader创建IndexSearcher
4、创建搜索的Query
5、根据searcher搜索并且返回TopDocs
6、根据TopDocs获取ScoreDocs对象
7、根据searcher和ScoreDocs对象获取具体的Document对象
8、根据Document对象获取需要的值
3.src
HelloLucene.java
package org.fool.lucene; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.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; import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.util.Version; public class HelloLucene { /** * 建立索引 */ public void index() { Directory directory = null; IndexWriter writer = null; try { // 1、创建Directory directory = FSDirectory.open(new File("C:/index")); // 创建在硬盘上 // 2、创建IndexWriter IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, new StandardAnalyzer(Version.LUCENE_36)); writer = new IndexWriter(directory, iwc); // 3、创建Document对象 Document doc = null; // 4、为Document对象添加Field File f = new File("C:/lucene"); for (File file : f.listFiles()) { doc = new Document(); // String content = FileUtils.readFileToString(file); // System.out.println(content); // doc.add(new Field("content", content, Field.Store.YES, // Field.Index.ANALYZED_NO_NORMS)); doc.add(new Field("content", new FileReader(file))); doc.add(new Field("fileName", file.getName(), Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.add(new Field("filePath", file.getAbsolutePath(), Field.Store.YES, Field.Index.NOT_ANALYZED)); // 5、通过IndexWriter添加文档到索引中 writer.addDocument(doc); } } catch (CorruptIndexException | LockObtainFailedException | FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 搜索 */ public void search() { Directory directory = null; IndexReader reader = null; IndexSearcher searcher = null; try { // 1、创建Directory directory = FSDirectory.open(new File("C:/index")); // 创建在硬盘上 // 2、创建IndexReader reader = IndexReader.open(directory); // 3、根据IndexReader创建IndexSearcher searcher = new IndexSearcher(reader); // 4、创建搜索的Query QueryParser parser = new QueryParser(Version.LUCENE_36, "content", new StandardAnalyzer(Version.LUCENE_36)); Query query = parser.parse("World"); // 5、根据searcher搜索并且返回TopDocs TopDocs tds = searcher.search(query, 10); // 6、根据TopDocs获取ScoreDocs对象 ScoreDoc[] sds = tds.scoreDocs; for (ScoreDoc sd : sds) { // 7、根据searcher和ScoreDocs对象获取具体的Document对象 Document document = searcher.doc(sd.doc); // 8、根据Document对象获取需要的值 System.out.println(document.get("fileName") + "(" + document.get("filePath") + ")"); } } catch (CorruptIndexException | ParseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 9、关闭reader try { searcher.close(); reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
4.test
TestHelloLucene.java
package org.fool.lucene; import org.junit.Before; import org.junit.Test; public class TestHelloLucene { private HelloLucene lucene; @Before public void setUp() throws Exception { lucene = new HelloLucene(); } @Test public void testIndex() { lucene.index(); } @Test public void testSearch() { lucene.search(); } }
5.Details
Field.Store.YES/NO(存储域选项)
设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原
设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完全还原(doc.get)
Field.Index.*(索引域选项)
Index.ANALYZED:进行分词和索引,适用于标题、内容等
Index.NOT_ANALYZED:进行索引,但是不进行分词,如果身份证号、姓名、ID等,适用于精确搜索
Index.ANALYZED_NOT_NORMS:进行分词但是不存储norms信息,这个norms中包括了创建索引的时间和权值等信息
Index.NOT_ANALYZED_NOT_NORMS:即不进行分词也不存储norms信息
Index.NO:不进行索引
最佳实践
Index.NOT_ANALYZED_NOT_NORMS YES 标识符(主键、文件名),电话号码,身份证号,姓名,日期
Index.ANALYZED YES 文档标题和摘要
Index.ANALYZED NO 文档正文
Index.NO YES 文档类型,数据库主键(不进行索引)
Index.NOT_ANALYZED NO 隐藏关键字
更多细节可以参考Lucene实战(第二版)
相关推荐
doc.add(new TextField("content", "Hello Lucene!", Field.Store.YES)); writer.addDocument(doc); writer.commit(); writer.close(); // 搜索文档 DirectoryReader reader = DirectoryReader.open...
《Lucene之HelloWorld》 在信息技术领域,搜索引擎是一个不可或缺的部分,而Apache Lucene作为一款高性能、全文本搜索库,为开发者提供了强大的文本检索能力。本文将深入探讨如何使用Lucene进行基本操作,通过...
例如,一个英文分词器可能会将句子"Hello World"拆分为"Hello"和"World"两个术语。 在导入这个Demo项目后,开发者可以查看和学习如何实例化分词器、创建索引以及执行搜索。分词器的配置是灵活的,可以根据需求选择...
本篇文章将深入探讨Lucene的几个常见示例,包括`LuceneDemo`、`LuceneZJ`、`Lucene_HelloWorld`,帮助初学者快速理解Lucene的基本操作。 1. **Lucene_HelloWorld** 这个示例是入门Lucene的首选,它展示了如何创建...
例如,英文Analyzer可能会将“hello world”拆分为“hello”和“world”。 - **创建Document**: 模拟数据库中的记录,Document包含字段(Field),如标题、正文等,每个字段可以指定是否被索引和存储。 - **添加...
《Lucene实战源码》是一本深入探讨Apache Lucene搜索引擎库的书籍,其配套的光盘代码包含了书中各个章节的示例和实验项目。Lucene是Java开发的全文搜索引擎库,广泛应用于各种信息检索和文本分析场景。通过研究这...
入门Lucene时,可以创建一个简单的HelloWorld程序,使用Lucene提供的API如IndexWriter进行索引的创建和维护,以及IndexSearcher进行索引的搜索。在Java环境中,需要引入相关的Lucene库,如lucene-analyzers-common、...
- **Hello World!** - 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **...
lucene构建索引,从HelloWorld到项目具体使用 ====================项目一:=================================== qianjun.lucene.first ====================项目二:=================================== qianjun....
《Lucene:初识搜索引擎库的“Hello World”》 Lucene,作为Apache软件基金会的顶级项目,是一款高性能、全文本检索引擎库,被广泛应用于各类搜索引擎和信息检索系统中。它提供了完整的搜索功能,包括索引、查询、...
要使用 Lucene 进行一个简单的搜索应用(Hello World),首先需要创建一个索引库,并将一些文档索引到这个库中。然后,可以通过构建查询来搜索这个索引库中的内容。具体的步骤如下: 1. **创建一个 IndexWriter ...
在给定的代码中,`Index`方法创建了一个包含100条记录的索引,每条记录的`name`字段从`name1`到`name100`,`value`字段都为`"Hello, World!"`。然后,`Search`方法使用`QueryParser`解析查询`name*`,并打印出所有...
hello.java 是对文档的内容检索 Hello1.java是对一组数据做检索 IncrementIndex 是对数据库表里数据进行创建索引、添加增量索引 TeacherIndex 是采用ssh框架的模式对数据库里面的表创建索引、添加增量索引、检索...
项目描述中的“Helloworld”通常代表入门级别的示例,可能包含以下步骤: 1. **创建索引**:首先,你需要创建一个索引,将数据(例如,文件内容)转换为Lucene可以理解和查询的格式。这涉及到读取文件,创建文档...
这个"Lucene演示"可能是为了帮助初学者理解和使用Lucene进行基本操作的一个实例,例如"HelloWorld"式的简单演示。 在开始深入Lucene之前,我们先理解一下全文搜索引擎的基本概念。全文搜索引擎不同于传统的数据库...
短语查询是用双引号包围的一组词,例如:"Hello dolly"。分析器在处理查询时会将输入的文本转化为Term。 - **布尔操作符**: - **OR**:默认操作符,表示至少有一个Term匹配即可。 - **AND**:所有Term必须匹配。...
Lucene解析器 一个最小的节点模块,提供将fetextquery parse为lucene syntax实用方法。 安装 npm install lucene-parser --save 用法 var lucene_parser = require ( 'lucene-parser' ) lucene_parser . ...
《Lucene入门之HelloWorld》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它提供了一个简单但功能强大的API,用于在各种应用中实现文本的索引和搜索。这篇博文将带你走进Lucene的世界,通过...
- **查询词**:单个词或词组,词组用双引号包围,如 "hello world"。 - **查询域**:指定查询的字段,如 `title:"Do it right"`。 - **通配符查询**:使用 `?` 表示一个任意字符,`*` 表示多个任意字符,但它们不...
**Lucene 入门教程** Lucene 是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、可扩展的、完全免费的搜索程序开发框架,使开发者能够轻松地在自己的应用...