1.导包

2.索引的创建

2.1首先,我们需要定义一个词法分析器。

Analyzer analyzer = new IKAnalyzer();//官方推荐 Analyzer analyzer = new StandardAnalyzer();

2.2第二步,确定索引文件存储的位置,Lucene提供给我们两种方式:

2.2.1本地文件存储

 Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));

2.2.2 内存存储

Directory directory = new RAMDirectory();

2.3第三步,创建IndexWriter,进行索引文件的写入。

IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
IndexWriter indexWriter = new IndexWriter(directory, config);

2.4第四步,内容提取,进行索引的存储。

Document doc = new Document();//申请了一个document对象,这个类似于数据库中的表中的一行。
String text = "This is the text to be indexed.";//即将索引的字符串
Field  fileNameField = new TextField("fileName", text, Store.YES);
doc.add(fileNameField);//把字符串存储起来
indexWriter.addDocument(doc);//把doc对象加入到索引创建中
indexWriter.close();//关闭IndexWriter,提交创建内容

lucene常见Field

IntField 主要对int类型的字段进行存储,需要注意的是如果需要对InfField进行排序使用SortField.Type.INT来比较,如果进范围查询或过滤,需要采用NumericRangeQuery.newIntRange()
LongField 主要处理Long类型的字段的存储,排序使用SortField.Type.Long,如果进行范围查询或过滤利用NumericRangeQuery.newLongRange(),LongField常用来进行时间戳的排序,保存System.currentTimeMillions()
FloatField 对Float类型的字段进行存储,排序采用SortField.Type.Float,范围查询采用NumericRangeQuery.newFloatRange()
BinaryDocVluesField 只存储不共享值,如果需要共享值可以用SortedDocValuesField
NumericDocValuesField  用于数值类型的Field的排序(预排序),需要在要排序的field后添加一个同名的NumericDocValuesField
SortedDocValuesField 用于String类型的Field的排序,需要在StringField后添加同名的SortedDocValuesField
StringField 用户String类型的字段的存储,StringField是只索引不分词
TextField 对String类型的字段进行存储,TextField和StringField的不同是TextField既索引又分词
StoredField 存储Field的值,可以用IndexSearcher.doc和IndexReader.document来获取此Field和存储的值

实战代码

@Testpublic void testIndex() throws Exception {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");BooksMapper booksMapper = ac.getBean(BooksMapper.class);/*Books book= booksMapper.selectByPrimaryKey(4939);System.out.println(book.getTitle());*/List<Books> listBooks=booksMapper.selectBookList();System.out.println(listBooks.size());Analyzer analyzer = new IKAnalyzer();Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);IndexWriter indexWriter = new IndexWriter(directory, config);for (int i = 0; i < listBooks.size(); i++) {Document doc = new Document();//申请了一个document对象,这个类似于数据库中的表中的一行。
             String title = listBooks.get(i).getTitle();Field filedTitle = new TextField("title", title, Store.YES);doc.add(filedTitle);String isbn = listBooks.get(i).getIsbn();Field filedISBN = new TextField("isbn", isbn, Store.YES);doc.add(filedISBN);int wordsCount = listBooks.get(i).getWordscount();Field filedWordsCount = new LongField("WordsCount", wordsCount, Store.YES);doc.add(filedWordsCount);indexWriter.addDocument(doc);//把doc对象加入到索引创建中
}indexWriter.close();//关闭IndexWriter,提交创建内容}

luke-5.0查看索引结果 (定位到luke-5.0所在的目录,然后输入码命令java -jar luke-5.0.jar

3.索引的查询

@Testpublic void testSearch() throws Exception {// 第一步:创建一个Directory对象,也就是索引库存放的位置。Directory directory = FSDirectory.open(new File("D:\\temp\\index"));// 磁盘// 第二步:创建一个indexReader对象,需要指定Directory对象。IndexReader indexReader = DirectoryReader.open(directory);// 第三步:创建一个indexsearcher对象,需要指定IndexReader对象IndexSearcher indexSearcher = new IndexSearcher(indexReader);// 第四步:创建一个TermQuery对象,指定查询的域和查询的关键词。Query query = new TermQuery(new Term("fileName", "lucene"));// 第五步:执行查询。TopDocs topDocs = indexSearcher.search(query, 10);// 第六步:返回查询结果。遍历查询结果并输出。ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int doc = scoreDoc.doc;Document document = indexSearcher.doc(doc);// 文件名称String fileName = document.get("fileName");System.out.println(fileName);// 文件内容String fileContent = document.get("fileContent");System.out.println(fileContent);// 文件大小String fileSize = document.get("fileSize");System.out.println(fileSize);// 文件路径String filePath = document.get("filePath");System.out.println(filePath);System.out.println("------------");}// 第七步:关闭IndexReader对象
        indexReader.close();}

4.查看标准分析器的分词效果

        @Testpublic void testTokenStream() throws Exception {// 创建一个标准分析器对象//Analyzer analyzer = new StandardAnalyzer();//Analyzer analyzer = new CJKAnalyzer();//Analyzer analyzer = new SmartChineseAnalyzer();Analyzer analyzer = new IKAnalyzer();// 获得tokenStream对象// 第一个参数:域名,可以随便给一个// 第二个参数:要分析的文本内容//TokenStream tokenStream = analyzer.tokenStream("test",//"The Spring Framework provides a comprehensive programming and configuration model.");TokenStream tokenStream = analyzer.tokenStream("test","高富帅可以用二维表结构来逻辑表达实现的数据");// 添加一个引用,可以获得每个关键词CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);// 添加一个偏移量的引用,记录了关键词的开始位置以及结束位置OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);// 将指针调整到列表的头部
            tokenStream.reset();// 遍历关键词列表,通过incrementToken方法判断列表是否结束while (tokenStream.incrementToken()) {// 关键词的起始位置System.out.println("start->" + offsetAttribute.startOffset());// 取关键词
                System.out.println(charTermAttribute);// 结束位置System.out.println("end->" + offsetAttribute.endOffset());}tokenStream.close();}

5.IKAnalyzer分词

5.1IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>  <comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">ext.dic;</entry> <!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords">stopword.dic;</entry>
</properties>

 5.2扩展ext.dic

高富帅
二维表

5.3停止stopword.dic

我
是
用
的
二
维
表
来
a
an
and
are
as
at
be
but
by
for
if
in
into
is
it
no
not
of
on
or
such
that
the
their
then
there
these
they
this
to
was
will
with

6.封装LuceneHelper

package com.mf.lucene;import java.io.File;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.Field.Store;
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.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;public class LuceneHelper {public IndexWriter getIndexWriter() throws Exception {Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));// Directory directory = new RAMDirectory();//保存索引到内存中 (内存索引库)Analyzer analyzer = new IKAnalyzer();IndexWriterConfig config = new IndexWriterConfig(Version.LATEST,analyzer);return new IndexWriter(directory, config);}//全删除
        @Testpublic void testAllDelete() throws Exception {IndexWriter indexWriter = getIndexWriter();indexWriter.deleteAll();indexWriter.close();}//根据条件删除
        @Testpublic void testDelete() throws Exception {IndexWriter indexWriter = getIndexWriter();Query query = new TermQuery(new Term("title","c#"));indexWriter.deleteDocuments(query);indexWriter.close();}//修改
        @Testpublic void testUpdate() throws Exception {IndexWriter indexWriter = getIndexWriter();Document doc = new Document();doc.add(new TextField("fileN", "测试文件名",Store.YES));doc.add(new TextField("fileC", "测试文件内容",Store.YES));indexWriter.updateDocument(new Term("isbn","9787115155108"), doc, new IKAnalyzer());indexWriter.close();}//IndexReader  IndexSearcherpublic IndexSearcher getIndexSearcher() throws Exception{// 第一步:创建一个Directory对象,也就是索引库存放的位置。Directory directory = FSDirectory.open(new File("D:\\JavaWeb\\Lucene"));// 磁盘// 第二步:创建一个indexReader对象,需要指定Directory对象。IndexReader indexReader = DirectoryReader.open(directory);// 第三步:创建一个indexsearcher对象,需要指定IndexReader对象return new IndexSearcher(indexReader);}//执行查询的结果public void printResult(IndexSearcher indexSearcher,Query query)throws Exception{// 第五步:执行查询。TopDocs topDocs = indexSearcher.search(query, 10);// 第六步:返回查询结果。遍历查询结果并输出。ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int doc = scoreDoc.doc;Document document = indexSearcher.doc(doc);// 文件名称String title = document.get("title");System.out.println(title);//WordsCountString WordsCount = document.get("WordsCount");System.out.println(WordsCount);System.out.println("------------");}}//查询所有
        @Testpublic void testMatchAllDocsQuery() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();Query query = new MatchAllDocsQuery();System.out.println(query);printResult(indexSearcher, query);//关闭资源
            indexSearcher.getIndexReader().close();}//根据数值范围查询
        @Testpublic void testNumericRangeQuery() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();Query query = NumericRangeQuery.newLongRange("WordsCount", 0L, 10000L, true, true);System.out.println(query);printResult(indexSearcher, query);//关闭资源
            indexSearcher.getIndexReader().close();}//可以组合查询条件
        @Testpublic void testBooleanQuery() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();BooleanQuery booleanQuery = new BooleanQuery();Query query1 = new TermQuery(new Term("title","c#"));Query query2 = new TermQuery(new Term("WordsCount","660000"));//  select * from user where id =1 or name = 'safdsa'
            booleanQuery.add(query1, Occur.MUST);booleanQuery.add(query2, Occur.MUST);System.out.println(booleanQuery);printResult(indexSearcher, booleanQuery);//关闭资源
            indexSearcher.getIndexReader().close();}//条件解释的对象查询
        @Testpublic void testQueryParser() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();//参数1: 默认查询的域  //参数2:采用的分析器QueryParser queryParser = new QueryParser("title",new IKAnalyzer());// *:*   域:值Query query = queryParser.parse("title:c#");printResult(indexSearcher, query);//关闭资源
            indexSearcher.getIndexReader().close();}//条件解析的对象查询   多个默念域
        @Testpublic void testMultiFieldQueryParser() throws Exception {IndexSearcher indexSearcher = getIndexSearcher();String[] fields = {"title","isbn"};//参数1: 默认查询的域  //参数2:采用的分析器MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields,new IKAnalyzer());// *:*   域:值Query query = queryParser.parse("c#");printResult(indexSearcher, query);//关闭资源
            indexSearcher.getIndexReader().close();}}

转载于:https://www.cnblogs.com/cnki/p/6746527.html

Lucene之Java实战相关推荐

  1. Java实战干货分享

    Java实战项目,架构锦集,自学月薪过万的不在话下. 实战项目 Java框架

  2. Java实战项目之人力资源管理系统【源码+课后指导】_Java毕业设计/计算机毕业设计

    对就业和毕业都有帮助的Java实战项目来咯--人力资源管理系统!Java实战项目之人力资源管理系统[源码+课后指导]_Java毕业设计/计算机毕业设计https://www.bilibili.com/ ...

  3. Java实战项目之个人日记本系统【源码+课后指导】_Java毕业设计/计算机毕业设计

    供大家练习学习用的Java实战项目来咯--[个人日记本系统]!Java实战项目之个人日记本系统[源码+课后指导]_Java毕业设计/计算机毕业设计https://www.bilibili.com/vi ...

  4. 尚学堂java实战第四章课后习题

    尚学堂java实战第四章课后习题 文章中的题目答案仅供参考 选择题答案: 1.B 解析:一个java类必然存在构造器,即使没有定义构造器,也会存在一个默认的无参构造器. 2.D 3.AC 解析: A( ...

  5. 【源码及课件分享】Java实战项目之酒店客房管理系统_Java项目开发_Java项目实战

    Java实战项目又双叒叕来咯~小伙伴们请查收~酒店客房管理系统![源码及课件分享]Java实战项目之酒店客房管理系统_Java项目开发_Java项目实战_Java毕业设计https://www.bil ...

  6. 酒店管理系统 Java实战 毕业设计

    Java实战项目    来咯~小伙伴们请查收~酒店客房管理系统!毕业设计的小伙伴不用慌张了哦! 07:23 [Java毕业设计]27分钟帮你搞定酒店管理系统(附项目运行) 00 敲码敲坏仨键盘 Jav ...

  7. JAVA实战之路(8):IDEA使用小技巧:IDEA禁止import *和允许import内部类

    IDEA 禁止import * 和允许import内部类 农师傅:老码农,xx年工作经验(洗头现在很省洗发水). 精通(xieguo)C.VC++.C#.Java等语言,熟悉(liaojie)Spri ...

  8. 【ssl认证、证书】SSL双向认证java实战、keytool创建证书

    文章目录 概述 keytool示例 参考 相关文章: //-----------Java SSL begin---------------------- [ssl认证.证书]SSL双向认证和SSL单向 ...

  9. 太空入侵者 -- 《电玩游戏Java实战DIY》

    飞机大战 这个让我想起,许多培训机构都会有一个项目"飞机大战",读书那会儿也浏览了该代码:下载图片资源,发现这个资源与我读书时看得不一样,但可以使用,资源重整了一下 ShootGa ...

最新文章

  1. 如何查看linux版本
  2. php拼音模糊查询,PHP模糊查询技术实例分析【附源码下载】
  3. tftp服务器_Transfer for Mac(TFTP服务器)
  4. c语言错误指导,c语言编程指导.pdf
  5. 架设mediawiki服务器续--安装VisualEditor编辑器
  6. python将元祖写入txt文档_python元祖和文件用法举例
  7. mysql获取离当前数据最近的数据_Mysql 获取最近数据信息
  8. mysql导出sql和表格文件大小_atitit.sql server2008导出导入数据库大的表格文件... oracle mysql...
  9. Java开发笔记(二)Java工程的帝国区划
  10. 外设驱动库开发笔记33:LCD1602液晶显示屏驱动
  11. Iphone IPA软件制作教程
  12. 《Collaborative Memory Network for Recommendation Systems》推荐系统之协同记忆网络CMN
  13. BJ模拟:超级绵羊抑或(类欧几里得)
  14. display: inline-block换行问题
  15. 联想电脑尺寸在哪里看_笔记本屏幕大小怎么看 查看笔记本屏幕型号尺寸方法...
  16. project info:
  17. Sybase数据库技术,数据库恢复---分享Sybase数据库知识(博客文章索引)
  18. 饥荒联机版Mod开发——配置代码环境(二)
  19. A Blockchain-Based Machine Learning Framework for Edge Services in IIoT 论文学习
  20. HTML5响应式苹果IOS风格后台办公界面模板

热门文章

  1. 如何在html页面遍历对象,Python:如何使用LXML/Requests遍历HTML元素对象?
  2. java 参数传递_java中方法的参数传递机制
  3. 朱峰谈概念设计(五):进入焦距
  4. 《动物森友会》的社交分级,在虚拟世界设计舒适的社交氛围
  5. pmp每日三题(2022年2月16日)
  6. SecureCRT自动记录日志
  7. 一位软件实施工程师的自述
  8. spring-boot-autoconfigure-xx.jar核心注解
  9. lazy初始化和线程安全的单例模式
  10. asp.net拦截器