热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lucene学习笔记一:lucene是什么、实现步骤、以及索引的创建、查询、修改、删除...

1.lucene学习笔记一1.1.lucene的作用实现文本搜索的框架,用于文本的搜索,非结构化文件的搜索。可以搜索文件里面的内容。用于电商网站上的搜索

1. lucene学习笔记一

1.1. lucene的作用

  1. 实现文本搜索的框架,用于文本的搜索,非结构化文件的搜索。可以搜索文件里面的内容。用于电商网站上的搜索。

  2. 实现文本搜索首先要进行索引的创建,索引创建了才能实现文本搜索。

640?wx_fmt=png
lucene执行流程

1.2. lucene的实现步骤

  1. 获取原始文档

  1. 创建文档对象

  1. 分析文档

640?wx_fmt=png
term区别
  1. 创建索引

640?wx_fmt=png
创建索引

1.3. lucene案例学习

  1. 创建java工程

  2. 导入包

  1. 创建索引

1IndexWriter indexWriter=new IndexWriter(directory, indexWriterConfig);new IndexWriter(directory, indexWriterConfig);

  1. 创建索引保存路径

1Directory directory =FSDirectory.open(new File("d:\\luceneindex\\index"));new File("d:\\luceneindex\\index"));

  1. 配置索引写入流的参数

1Analyzer analyzer=new StandardAnalyzer();2IndexWriterConfig indexWriterCOnfig=new IndexWriterConfig(Version.LATEST, analyzer);new StandardAnalyzer();
2IndexWriterConfig indexWriterCOnfig=new IndexWriterConfig(Version.LATEST, analyzer);

  1. 创建一个Document文件,这个文件用来专门存储各种域对象

1Document document=new Document();new Document();

  1. 通过文件流的输入获取要分析的资源,并将资源存储到数组中

1File file=new File("D:\\luceneindex\\searchsource");2File[] listFiles = file.listFiles();new File("D:\\luceneindex\\searchsource");
2File[] listFiles = file.listFiles();

  1. for增强循环遍历该数组

1for(File file2:listFiles) { 2    //文件名称 3    String file_name=file2.getName();     4    Field fileNameField=new TextField("fileName",file_name,Store.YES); 5    //文件大小 6    long file_size = FileUtils.sizeOf(file2); 7    Field fileSizeField=new LongField("fileSize", file_size, Store.YES); 8    //文件路径 9    String file_path = file2.getPath();10    Field filePathField=new StoredField("filePath", file_path);11    //文件内容12    String file_context = FileUtils.readFileToString(file2);13    Field fileCOntextField=new TextField("fileContext", file_context,Store.YES);for(File file2:listFiles) {
2    //文件名称
3    String file_name=file2.getName();    
4    Field fileNameField=new TextField("fileName",file_name,Store.YES);
5    //文件大小
6    long file_size = FileUtils.sizeOf(file2);
7    Field fileSizeField=new LongField("fileSize", file_size, Store.YES);
8    //文件路径
9    String file_path = file2.getPath();
10    Field filePathField=new StoredField("filePath", file_path);
11    //文件内容
12    String file_context = FileUtils.readFileToString(file2);
13    Field fileCOntextField=new TextField("fileContext", file_context,Store.YES);

  1. 将所有域对象存储到document文档中

1document.add(fileContextField);2document.add(filePathField);3document.add(fileSizeField);4document.add(fileNameField);
2document.add(filePathField);
3document.add(fileSizeField);
4document.add(fileNameField);

  1. 使用indexWriter对象将document中的内容添加到索引库中,并将索引也添加到了索引库

1//使用indexWriter对象将document对象写入索引库,此时进行索引创建,并将索引和document对象写入索引库。2indexWriter.addDocument(document);//使用indexWriter对象将document对象写入索引库,此时进行索引创建,并将索引和document对象写入索引库。
2indexWriter.addDocument(document);

  1. 关闭indexWriter流

1//关流2indexWriter.close();//关流
2indexWriter.close();

1.4. 查询索引

  1. 创建一个Directory对象,获取索引所在路径

1//第一步:创建一个Directory对象,获取索引库存放的位置。2Directory directory=FSDirectory.open(new File("d:\\luceneindex\\index"));//第一步:创建一个Directory对象,获取索引库存放的位置。
2Directory directory=FSDirectory.open(new File("d:\\luceneindex\\index"));

  1. 创建索引读取流

1//第二步;创建一个indexReader索引读取流,指定Directory路径2IndexReader indexReader=DirectoryReader.open(directory);//第二步;创建一个indexReader索引读取流,指定Directory路径
2IndexReader indexReader=DirectoryReader.open(directory);

  1. 创建索引查找对象并指定查找的内容,即:读取的内容

1//第三步:indexSearcher对象,需要指定IndexReader对象2IndexSearcher indexSearcher=new IndexSearcher(indexReader);//第三步:indexSearcher对象,需要指定IndexReader对象
2IndexSearcher indexSearcher=new IndexSearcher(indexReader);

  1. 创建一个TermQuery对象指定查询的关键词

1//第四步:创建一个TermQuery对象,指定查询的域和关键词2Query query=new TermQuery(new Term("fileName","apache"));//第四步:创建一个TermQuery对象,指定查询的域和关键词
2Query query=new TermQuery(new Term("fileName","apache"));

  1. 执行查询

1//第五步:执行查询2TopDocs topDocs = indexSearcher.search(query, 2);//第五步:执行查询
2TopDocs topDocs = indexSearcher.search(query, 2);

  1. 返回查询结果

1//第六步:返回查询结果,遍历查询结果并输出2ScoreDoc[] scoreDocs = topDocs.scoreDocs;//第六步:返回查询结果,遍历查询结果并输出
2ScoreDoc[] scoreDocs = topDocs.scoreDocs;

  1. 遍历查询结果

1for(ScoreDoc scoreDoc:scoreDocs) { 2    int doc = scoreDoc.doc; 3    Document document=indexSearcher.doc(doc); 4    //文件名 5    String fileName=document.get("fileName"); 6    System.out.println(fileName); 7    String fileCOntext=document.get("fileContext"); 8    System.out.println(fileContext); 9    String fileSize=document.get("fileSize");10    System.out.println(fileSize);11    String filePath=document.get("filePath");12    System.out.println(filePath);13}for(ScoreDoc scoreDoc:scoreDocs) {
2    int doc = scoreDoc.doc;
3    Document document=indexSearcher.doc(doc);
4    //文件名
5    String fileName=document.get("fileName");
6    System.out.println(fileName);
7    String fileCOntext=document.get("fileContext");
8    System.out.println(fileContext);
9    String fileSize=document.get("fileSize");
10    System.out.println(fileSize);
11    String filePath=document.get("filePath");
12    System.out.println(filePath);
13}

  1. 关闭流

1//第七步:关闭indexReader流2indexReader.close();//第七步:关闭indexReader流
2indexReader.close();

  1. 搜索使用的分析器和索引使用的分析器要一致。

1.5. 索引的删除

  1. 创建一个IndexWriter对象,注意这个对象是包含索引存储路径,和所使用分析器的对象。

1public IndexWriter getIndexWriter() throws Exception{2    Directory directory = FSDirectory.open(new File("D:\\temp\\index"));3    // Directory directory = new RAMDirectory();//保存索引到内存中 (内存索引库)4    Analyzer analyzer = new StandardAnalyzer();// 官方推荐5    IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);6    return new IndexWriter(directory, config);7}public IndexWriter getIndexWriter() throws Exception{
2    Directory directory = FSDirectory.open(new File("D:\\temp\\index"));
3    // Directory directory = new RAMDirectory();//保存索引到内存中 (内存索引库)
4    Analyzer analyzer = new StandardAnalyzer();// 官方推荐
5    IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
6    return new IndexWriter(directory, config);
7}

  1. 删除文档

1//全删除2@Test3public void testAllDelete() throws Exception {4    IndexWriter indexWriter = getIndexWriter();5    indexWriter.deleteAll();6    indexWriter.close();7}//全删除
2@Test
3public void testAllDelete() throws Exception {
4    IndexWriter indexWriter = getIndexWriter();
5    indexWriter.deleteAll();
6    indexWriter.close();
7}

  1. 条件删除

1//根据条件删除2@Test3public void testDelete() throws Exception {4    IndexWriter indexWriter = getIndexWriter();5    Query query = new TermQuery(new Term("fileName","apache"));6    indexWriter.deleteDocuments(query);7    indexWriter.close();8}//根据条件删除
2@Test
3public void testDelete() throws Exception {
4    IndexWriter indexWriter = getIndexWriter();
5    Query query = new TermQuery(new Term("fileName","apache"));
6    indexWriter.deleteDocuments(query);
7    indexWriter.close();
8}

1.6. 修改索引

  1. 使用updateDocument方法

1//修改 2@Test 3public void testUpdate() throws Exception { 4    IndexWriter indexWriter = getIndexWriter(); 5    Document doc = new Document(); 6    doc.add(new TextField("fileN", "测试文件名",Store.YES)); 7    doc.add(new TextField("fileC", "测试文件内容",Store.YES)); 8    indexWriter.updateDocument(new Term("fileName","lucene"), doc, new IKAnalyzer()); 9    indexWriter.close();10}//修改
2@Test
3public void testUpdate() throws Exception {
4    IndexWriter indexWriter = getIndexWriter();
5    Document doc = new Document();
6    doc.add(new TextField("fileN""测试文件名",Store.YES));
7    doc.add(new TextField("fileC""测试文件内容",Store.YES));
8    indexWriter.updateDocument(new Term("fileName","lucene"), doc, new IKAnalyzer());
9    indexWriter.close();
10}

1.7. 查询索引

  1. 查询所有:使用MatchAllDocsQuery类

1//查询所有 2@Test 3public void testMatchAllDocsQuery() throws Exception { 4    IndexSearcher indexSearcher = getIndexSearcher(); 5    Query query = new MatchAllDocsQuery(); 6    System.out.println(query); 7    printResult(indexSearcher, query); 8    //关闭资源 9    indexSearcher.getIndexReader().close();10}//查询所有
2@Test
3public void testMatchAllDocsQuery() throws Exception {
4    IndexSearcher indexSearcher = getIndexSearcher();
5    Query query = new MatchAllDocsQuery();
6    System.out.println(query);
7    printResult(indexSearcher, query);
8    //关闭资源
9    indexSearcher.getIndexReader().close();
10}

  1. 精确查询:TermQuery

  2. 根据数值范围查询

1//根据数值范围查询 2@Test 3public void testNumericRangeQuery() throws Exception { 4    IndexSearcher indexSearcher = getIndexSearcher(); 5    //false是不包含左边区间,true是包含右边区间 6    Query query = NumericRangeQuery.newLongRange("fileSize", 47L, 200L, false, true); 7    System.out.println(query); 8    printResult(indexSearcher, query); 9    //关闭资源10    indexSearcher.getIndexReader().close();11}//根据数值范围查询
2@Test
3public void testNumericRangeQuery() throws Exception {
4    IndexSearcher indexSearcher = getIndexSearcher();
5    //false是不包含左边区间,true是包含右边区间
6    Query query = NumericRangeQuery.newLongRange("fileSize"47L200Lfalsetrue);
7    System.out.println(query);
8    printResult(indexSearcher, query);
9    //关闭资源
10    indexSearcher.getIndexReader().close();
11}

  1. 组合查询

1//可以组合查询条件 2@Test 3public void testBooleanQuery() throws Exception { 4    IndexSearcher indexSearcher = getIndexSearcher(); 5    BooleanQuery booleanQuery = new BooleanQuery(); 6    Query query1 = new TermQuery(new Term("fileName","apache")); 7    Query query2 = new TermQuery(new Term("fileName","lucene")); 8    //  select * from user where id =1 or name = 'safdsa' 9    booleanQuery.add(query1, Occur.MUST);//必须,该名字上必须有apache10    booleanQuery.add(query2, Occur.SHOULD);//非必须,可以没有11    System.out.println(booleanQuery);12    printResult(indexSearcher, booleanQuery);13    //关闭资源14    indexSearcher.getIndexReader().close();15}//可以组合查询条件
2@Test
3public void testBooleanQuery() throws Exception {
4    IndexSearcher indexSearcher = getIndexSearcher();
5    BooleanQuery booleanQuery = new BooleanQuery();
6    Query query1 = new TermQuery(new Term("fileName","apache"));
7    Query query2 = new TermQuery(new Term("fileName","lucene"));
8    //  select * from user where id =1 or name = 'safdsa'
9    booleanQuery.add(query1, Occur.MUST);//必须,该名字上必须有apache
10    booleanQuery.add(query2, Occur.SHOULD);//非必须,可以没有
11    System.out.println(booleanQuery);
12    printResult(indexSearcher, booleanQuery);
13    //关闭资源
14    indexSearcher.getIndexReader().close();
15}

1.8. 使用解析查询

  1. 利用QueryParser查询

1//条件解释的对象查询 2@Test 3public void testQueryParser() throws Exception { 4    IndexSearcher indexSearcher = getIndexSearcher(); 5    //参数1: 默认查询的域   6    //参数2:采用的分析器 7    QueryParser queryParser = new QueryParser("fileName",new IKAnalyzer()); 8    // *:*   域:值 9    Query query = queryParser.parse("fileName:lucene is apache OR fileContent:lucene is apache");1011    printResult(indexSearcher, query);12    //关闭资源13    indexSearcher.getIndexReader().close();14}//条件解释的对象查询
2@Test
3public void testQueryParser() throws Exception {
4    IndexSearcher indexSearcher = getIndexSearcher();
5    //参数1: 默认查询的域  
6    //参数2:采用的分析器
7    QueryParser queryParser = new QueryParser("fileName",new IKAnalyzer());
8    // *:*   域:值
9    Query query = queryParser.parse("fileName:lucene is apache OR fileContent:lucene is apache");
10
11    printResult(indexSearcher, query);
12    //关闭资源
13    indexSearcher.getIndexReader().close();
14}

  1. 多个默认查询域

1//条件解析的对象查询   多个默念域 2@Test 3public void testMultiFieldQueryParser() throws Exception { 4    IndexSearcher indexSearcher = getIndexSearcher(); 5    String[] fields = {"fileName","fileContent"}; 6    //参数1: 默认查询的域   7    //参数2:采用的分析器 8    MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields,new IKAnalyzer()); 9    // *:*   域:值10    Query query = queryParser.parse("lucene is apache");11    printResult(indexSearcher, query);12    //关闭资源13    indexSearcher.getIndexReader().close();14}//条件解析的对象查询   多个默念域
2@Test
3public void testMultiFieldQueryParser() throws Exception {
4    IndexSearcher indexSearcher = getIndexSearcher();
5    String[] fields = {"fileName","fileContent"};
6    //参数1: 默认查询的域  
7    //参数2:采用的分析器
8    MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields,new IKAnalyzer());
9    // *:*   域:值
10    Query query = queryParser.parse("lucene is apache");
11    printResult(indexSearcher, query);
12    //关闭资源
13    indexSearcher.getIndexReader().close();
14}




推荐阅读
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
author-avatar
艾薇卡皮草它_791
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有