`

Hello Lucene

 
阅读更多

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实战(第二版)

 

 

分享到:
评论

相关推荐

    lucene-6.5.1

    doc.add(new TextField("content", "Hello Lucene!", Field.Store.YES)); writer.addDocument(doc); writer.commit(); writer.close(); // 搜索文档 DirectoryReader reader = DirectoryReader.open...

    Lucene之Helloworld

    《Lucene之HelloWorld》 在信息技术领域,搜索引擎是一个不可或缺的部分,而Apache Lucene作为一款高性能、全文本搜索库,为开发者提供了强大的文本检索能力。本文将深入探讨如何使用Lucene进行基本操作,通过...

    Lucene-Demo.rar Lucene分词的demo

    例如,一个英文分词器可能会将句子"Hello World"拆分为"Hello"和"World"两个术语。 在导入这个Demo项目后,开发者可以查看和学习如何实例化分词器、创建索引以及执行搜索。分词器的配置是灵活的,可以根据需求选择...

    Lucene常用的Demo

    本篇文章将深入探讨Lucene的几个常见示例,包括`LuceneDemo`、`LuceneZJ`、`Lucene_HelloWorld`,帮助初学者快速理解Lucene的基本操作。 1. **Lucene_HelloWorld** 这个示例是入门Lucene的首选,它展示了如何创建...

    使用Lucene.net进行全文搜索

    例如,英文Analyzer可能会将“hello world”拆分为“hello”和“world”。 - **创建Document**: 模拟数据库中的记录,Document包含字段(Field),如标题、正文等,每个字段可以指定是否被索引和存储。 - **添加...

    lucene实战源码.rar

    《Lucene实战源码》是一本深入探讨Apache Lucene搜索引擎库的书籍,其配套的光盘代码包含了书中各个章节的示例和实验项目。Lucene是Java开发的全文搜索引擎库,广泛应用于各种信息检索和文本分析场景。通过研究这...

    全文搜索Lucene&ElasticSearch-新版.doc

    入门Lucene时,可以创建一个简单的HelloWorld程序,使用Lucene提供的API如IndexWriter进行索引的创建和维护,以及IndexSearcher进行索引的搜索。在Java环境中,需要引入相关的Lucene库,如lucene-analyzers-common、...

    Annotated Lucene 中文版 Lucene源码剖析

    - **Hello World!** - 创建一个简单的索引,并进行基本的查询操作,这是入门Lucene的第一步。 - **Lucene Roadmap**: - 了解Lucene的发展历程及其未来规划对于开发者来说非常重要。 #### 索引文件结构 - **...

    lucene:lucene构建索引,从HelloWorld到项目具体使用

    lucene构建索引,从HelloWorld到项目具体使用 ====================项目一:=================================== qianjun.lucene.first ====================项目二:=================================== qianjun....

    lucene(HelloWord)

    《Lucene:初识搜索引擎库的“Hello World”》 Lucene,作为Apache软件基金会的顶级项目,是一款高性能、全文本检索引擎库,被广泛应用于各类搜索引擎和信息检索系统中。它提供了完整的搜索功能,包括索引、查询、...

    lucene-入门

    要使用 Lucene 进行一个简单的搜索应用(Hello World),首先需要创建一个索引库,并将一些文档索引到这个库中。然后,可以通过构建查询来搜索这个索引库中的内容。具体的步骤如下: 1. **创建一个 IndexWriter ...

    lucene学习,lucene对txt,pdf,html格式的学习

    在给定的代码中,`Index`方法创建了一个包含100条记录的索引,每条记录的`name`字段从`name1`到`name100`,`value`字段都为`"Hello, World!"`。然后,`Search`方法使用`QueryParser`解析查询`name*`,并打印出所有...

    lucene全文检索-javademo.rar

    hello.java 是对文档的内容检索 Hello1.java是对一组数据做检索 IncrementIndex 是对数据库表里数据进行创建索引、添加增量索引 TeacherIndex 是采用ssh框架的模式对数据库里面的表创建索引、添加增量索引、检索...

    lucene项目代码

    项目描述中的“Helloworld”通常代表入门级别的示例,可能包含以下步骤: 1. **创建索引**:首先,你需要创建一个索引,将数据(例如,文件内容)转换为Lucene可以理解和查询的格式。这涉及到读取文件,创建文档...

    Lucene演示

    这个"Lucene演示"可能是为了帮助初学者理解和使用Lucene进行基本操作的一个实例,例如"HelloWorld"式的简单演示。 在开始深入Lucene之前,我们先理解一下全文搜索引擎的基本概念。全文搜索引擎不同于传统的数据库...

    J2EE项目系列(四)-SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN).zip

    -安装、helloworld以及阅读懂配置文件(四)Redis系列(二)--服务器设计(整表服务器以及排行榜服务器方案实现)(五)Lucene总结系列(一)--认识、helloworld以及基本的api操作。(六)Lucene总结系列(二)--...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-12.Lucene搜索深入实战进阶2 共9页.pptx

    短语查询是用双引号包围的一组词,例如:"Hello dolly"。分析器在处理查询时会将输入的文本转化为Term。 - **布尔操作符**: - **OR**:默认操作符,表示至少有一个Term匹配即可。 - **AND**:所有Term必须匹配。...

    lucene-parser

    Lucene解析器 一个最小的节点模块,提供将fetextquery parse为lucene syntax实用方法。 安装 npm install lucene-parser --save 用法 var lucene_parser = require ( 'lucene-parser' ) lucene_parser . ...

    lunece入门之HelloWorld

    《Lucene入门之HelloWorld》 Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发并维护。它提供了一个简单但功能强大的API,用于在各种应用中实现文本的索引和搜索。这篇博文将带你走进Lucene的世界,通过...

    lucene相关文档

    - **查询词**:单个词或词组,词组用双引号包围,如 "hello world"。 - **查询域**:指定查询的字段,如 `title:"Do it right"`。 - **通配符查询**:使用 `?` 表示一个任意字符,`*` 表示多个任意字符,但它们不...

Global site tag (gtag.js) - Google Analytics