java框架---->lucene的使用(一)
Lucene是一个全文检索的框架,apache组织提供了一个用Java实现的全文搜索引擎的开源项目。这里我们对apache的lucene的框架做一个简单的介绍。心甘情愿这四个字,透着一股卑微,但也有藏不住的勇敢。
lucene的第一个实例
一、maven中引入的依赖pom.xml
<properties>
<lucene.version>6.6.0</lucene.version>
<common-io.version>2.5</common-io.version>
</properties>
<dependencies>
<!-- lucene core的依赖-->
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>${lucene.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>${lucene.version}</version>
</dependency>
<!-- commomsIO的依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${common-io.version}</version>
</dependency>
</dependencies>
二、关于lucene的java代码如下
package com.linux.huhx.lucene_1;
import org.apache.commons.io.FileUtils;
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.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
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.RAMDirectory;
import java.io.File;
import java.io.IOException;
public class BaseLucene_1 {
public static void main(String[] args) throws Exception {
// 存放在内存中
Directory dir = new RAMDirectory();
new BaseLucene_1().createIndex(dir);
new BaseLucene_1().search(dir);
}
/**
* 创建索引
*/
public void createIndex(Directory dir) throws IOException {
IndexWriter indexWriter = null;
// 1. 创建 Directory (索引存放位置),这里是参数dir
// 2. 创建IndexWriter 写索引
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
indexWriter = new IndexWriter(dir, iwc);
// 3. 创建Document 对象 field
Document document;
File file = new File("file/example");
for (File f : file.listFiles()) {
document = new Document();
// 4. 为Documen添加field
document.add(new Field("content", FileUtils.readFileToString(f, "utf-8"), TextField.TYPE_STORED));
document.add(new TextField("fileName", f.getName(), Field.Store.YES));
document.add(new StringField("filePath", f.getAbsolutePath(), Field.Store.YES));
// 5. 通过IndexWriter 添加文档到索引中
indexWriter.addDocument(document);
}
indexWriter.close();
}
/**
* 根据内容搜索
* @param dir
* @throws Exception
*/
public void search(Directory dir) throws Exception {
IndexReader indexReader = null;
// 1. 创建 Directory,这里通过参数传递过来的dir
// Directory dir = FSDirectory.open(new File("file/index").toPath()); // 本地磁盘
// 2. 创建 IndexReader
indexReader = DirectoryReader.open(dir);
// 3. 创建 IndexSearch
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
// 4. 创建搜索的Query
// 创建parse确定搜索的内容,第二个参数为搜索的file
QueryParser queryParser = new QueryParser("content", new StandardAnalyzer());
// 创建Query,表示搜索域中的内容
Query query = queryParser.parse("love");
// 5. 搜索并返回 TopDocs
TopDocs topDocs = indexSearcher.search(query, 10);
// 6. 根据topDocs 获得 scoreDocs
ScoreDoc[] socreDocs = topDocs.scoreDocs;
for (ScoreDoc doc : socreDocs) {
// 获取Document对象
Document document = indexSearcher.doc(doc.doc);
// 根据Document对象获取需要的值
System.out.println(document.get("fileName"));
System.out.println(document.get("content"));
}
indexReader.close();
}
}
三、运行的结果如下
java1.txt
I love you, java.
java2.txt
I love you, linux.
java3.txt
I love you, huhx.
lucene的一些说明介绍
一、Lucene建立索引过程的几个核心类
1、IndexWriter: 索引过程的核心组件,这个类负责创建新索引或者打开已有索引,以及向索引中添加、删除或更新索引的信息。
2、Directory: 描述了Lucene索引的存放位置。它是一个抽象类,它的子类负责具体指定索引的存储路径。
3、Analyzer: 文本文件在被索引之前,需要经过Analyzer处理。Analyzer是由InderWriter的构造方法来指定的,它负责从被索引文本文件中提取语汇单元,交提出剩下的无用信息。
4、Document:代表一些域(Field)的集合,比如元数据(作者、标题、主题和修改日期)都可以作为文档的不同域单独存储并被索引。Lucene的内核只处理java.lang.String、java.io.Reader对象和本地数字类型。
5、Field:索引中的每个文档都包含一个或多个不同命名的域,这些域包含在Field类中。每个域都有一个域名和对应的域值,以及一组选项来精确控制Lucene索引操作各个域值。
二、Lucene搜索过程中的几个核心类
1、InderSearcher: 用于搜索由IndexWriter类创建的索引,这个类公开了几个搜索方法,它是连接索引的中心环节。
2、Term: 是搜索功能的基本单元,与Field对象类似,Term对象包含一对字符串元素:域名和单词。它还与索引操作有着。
3、Query: 是查询类的父类。子类例如:BooleanQuery、SpanQuery、PhraseQuery等等。
4、TermQuery: Lucene提供的最基本的查询类型,它用来匹配指定域中包含特定项的文档。
5、TopDocs: 一个简单的指针容器,指针一般指向前N个排名的搜索结果,搜索结果即匹配查询条件的文档。
作者:
huhx
出处: www.cnblogs.com/huhx
格言:你尽力了,才有资格说自己的运气不好。
版权:本文版权归作者huhx和博客园共有,欢迎转载。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
出处: www.cnblogs.com/huhx
格言:你尽力了,才有资格说自己的运气不好。
版权:本文版权归作者huhx和博客园共有,欢迎转载。未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!