Lucene的使用,Lucene入门

电玩女神 2022-05-23 03:23 305阅读 0赞

本文主要介绍几个方面,为什么使用Lucene使用场景,解决的问题,Lucene的入门使用,以及Lucene一些语法(增删改查)。

一简述Lucene概念:磁盘上的一些邮件,文档等各种文件,通过工具,把其变得有结构性,就是他们的信息扫描,记录位置,记录内容,建成索引。这样你就可以通过这些索引快速找到这些文件位置以及想要的内容。就像查字典一样,字典的拼音表和部首检字表就相当于字典的索引,按着拼音或者偏旁部首查,会很快,不用自己从头找到尾……,Lucene就是这样的一个工具,他帮我们建了字典的查询目录,就是索引。我们把这个技术叫做全文检索。

二:一些使用场景:Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能。对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如百度、Google等搜索引擎、博客,论坛站内搜索、电商网站站内搜索等。

三:Lucene实现索引检索的流程:

70

绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,就是通过获取原始文件信息,创建索引,把索引放到索引库,这个索引库需要你自己制定存放目录:索引过程包括:确定原始内容(即要搜索的内容),采集文档,创建文档,分析文档,索引文档。
红色表示搜索过程,从索引库中搜索内容,搜索过程包括:用户通过搜索界面创建查询执行搜索,从索引库搜索渲染搜索结果。这里的搜索界面Lucene并不提供,不过有很多这种客户端。我们一般通过程序实现索引的搜索。

四:使用Java实现Lucene的增删改查,(这里不需要安装Lucene客户端),只需代码操作,如图引入相关jar包,包括中文分词,Lucene搜索语法用的包,测试包等:

20180531225123337

编写创建索引的代码:

  1. @Test
  2. public void createIndex() throws Exception {
  3. //指定索引库存放的路径//D:\temp\0108\index
  4. Directory directory = FSDirectory.open(new File("D:\\lucene\\index"));
  5. //创建一个标准分析器
  6. Analyzer analyzer = new StandardAnalyzer();
  7. //创建indexwriterCofig对象,第一个参数: Lucene的版本信息,可以选择对应的lucene版本也可以使用LATEST
  8. //第二根参数:分析器对象
  9. IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
  10. //创建indexwriter对象
  11. IndexWriter indexWriter = new IndexWriter(directory, config);
  12. //原始文档的路径
  13. File dir=new File("D:\\data\\lucene\\资料");
  14. for (File f : dir.listFiles()) {
  15. //文件名
  16. String fileName = f.getName();
  17. //文件内容
  18. String fileContent = FileUtils.readFileToString(f);
  19. //文件路径
  20. String filePath = f.getPath();
  21. //文件的大小
  22. long fileSize = FileUtils.sizeOf(f);
  23. //创建文件名域
  24. //第一个参数:域的名称,第二个参数:域的内容,第三个参数:是否存储
  25. Field fileNameField = new TextField("filename", fileName, Store.YES);
  26. //文件内容域
  27. Field fileContentField = new TextField("content", fileContent, Store.YES);
  28. //文件路径域(不分析、不索引、只存储)
  29. Field filePathField = new StoredField("path", filePath);
  30. //文件大小域
  31. Field fileSizeField = new LongField("size", fileSize, Store.YES);
  32. //创建document对象
  33. Document document = new Document();
  34. document.add(fileNameField);
  35. document.add(fileContentField);
  36. document.add(filePathField);
  37. document.add(fileSizeField);
  38. //创建索引,并写入索引库
  39. indexWriter.addDocument(document);
  40. }
  41. //关闭indexwriter
  42. indexWriter.close();
  43. }

实现简单搜索测试

  1. private IndexSearcher getIndexSearcher() throws Exception {
  2. //指定索引库存放的路径
  3. Directory directory = FSDirectory.open(new File("C:\\temp\\index"));
  4. //创建一个IndexReader对象
  5. IndexReader indexReader = DirectoryReader.open(directory);
  6. //创建IndexSearcher对象
  7. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  8. return indexSearcher;
  9. }
  10. private void printResult(IndexSearcher indexSearcher, Query query) throws Exception {
  11. //查询索引库
  12. TopDocs topDocs = indexSearcher.search(query, 100);
  13. ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  14. System.out.println("查询结果总记录数:" + topDocs.totalHits);
  15. //遍历查询结果
  16. for (ScoreDoc scoreDoc : scoreDocs) {
  17. int docId = scoreDoc.doc;
  18. //通过id查询文档对象
  19. Document document = indexSearcher.doc(docId);
  20. //取属性
  21. System.out.println(document.get("name"));
  22. System.out.println(document.get("size"));
  23. System.out.println(document.get("content"));
  24. System.out.println(document.get("path"));
  25. }
  26. //关闭索引库
  27. indexSearcher.getIndexReader().close();
  28. }

索引的删除与修改

  1. @Test
  2. public void deleteAllIndex() throws Exception {
  3. Directory directory = FSDirectory.open(new File("D:\\data\\资料\\lucene&solr\\index"));
  4. IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
  5. // 创建一个indexwriter对象
  6. IndexWriter indexWriter = new IndexWriter(directory, config);
  7. // 删除全部索引
  8. indexWriter.deleteAll();
  9. // 关闭indexwriter
  10. indexWriter.close();
  11. }
  12. // 根据查询条件删除索引
  13. @Test
  14. public void deleteIndexByQuery() throws Exception {
  15. Directory directory = FSDirectory.open(new File("D:\\data\\index"));
  16. IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
  17. // 创建一个indexwriter对象
  18. IndexWriter indexWriter = new IndexWriter(directory, config);
  19. // 创建一个查询条件
  20. Query query = new TermQuery(new Term("filename", "apache"));
  21. // 根据查询条件删除
  22. indexWriter.deleteDocuments(query);
  23. // 关闭indexwriter
  24. indexWriter.close();
  25. }
  26. //修改索引库
  27. @Test
  28. public void updateIndex() throws Exception {
  29. Directory directory = FSDirectory.open(new File("D:\\dataindex"));
  30. IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, new IKAnalyzer());
  31. // 创建一个indexwriter对象
  32. IndexWriter indexWriter = new IndexWriter(directory, config);
  33. //创建一个Document对象
  34. Document document = new Document();
  35. //向document对象中添加域。
  36. //不同的document可以有不同的域,同一个document可以有相同的域。
  37. document.add(new TextField("filename", "要更新的文档", Store.YES));
  38. document.add(new TextField("content", "2013年11月18日 - Lucene 简介 Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。", Store.YES));
  39. indexWriter.updateDocument(new Term("content", "java"), document);
  40. //关闭indexWriter
  41. indexWriter.close();
  42. }
  43. Lucene的查询
  44. private IndexSearcher getIndexSearcher() throws Exception {
  45. //指定索引库存放的路径
  46. Directory directory = FSDirectory.open(new File("C:\\temp\\index"));
  47. //创建一个IndexReader对象
  48. IndexReader indexReader = DirectoryReader.open(directory);
  49. //创建IndexSearcher对象
  50. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  51. return indexSearcher;
  52. }
  53. private void printResult(IndexSearcher indexSearcher, Query query) throws Exception {
  54. //查询索引库
  55. TopDocs topDocs = indexSearcher.search(query, 100);
  56. ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  57. System.out.println("查询结果总记录数:" + topDocs.totalHits);
  58. //遍历查询结果
  59. for (ScoreDoc scoreDoc : scoreDocs) {
  60. int docId = scoreDoc.doc;
  61. //通过id查询文档对象
  62. Document document = indexSearcher.doc(docId);
  63. //取属性
  64. System.out.println(document.get("name"));
  65. System.out.println(document.get("size"));
  66. System.out.println(document.get("content"));
  67. System.out.println(document.get("path"));
  68. }
  69. //关闭索引库
  70. indexSearcher.getIndexReader().close();
  71. }
  72. @Test
  73. public void testMatchAllDocsQuery() throws Exception {
  74. //指定索引库存放的路径
  75. Directory directory = FSDirectory.open(new File("C:\\temp\\index"));
  76. //创建一个IndexReader对象
  77. IndexReader indexReader = DirectoryReader.open(directory);
  78. //创建IndexSearcher对象
  79. IndexSearcher indexSearcher = new IndexSearcher(indexReader);
  80. //创建一个Query对象
  81. Query query = new MatchAllDocsQuery();
  82. System.out.println(query);
  83. //查询索引库
  84. TopDocs topDocs = indexSearcher.search(query, 100);
  85. ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  86. System.out.println("查询结果总记录数:" + topDocs.totalHits);
  87. //遍历查询结果
  88. for (ScoreDoc scoreDoc : scoreDocs) {
  89. int docId = scoreDoc.doc;
  90. //通过id查询文档对象
  91. Document document = indexSearcher.doc(docId);
  92. //取属性
  93. System.out.println(document.get("name"));
  94. System.out.println(document.get("size"));
  95. System.out.println(document.get("content"));
  96. System.out.println(document.get("path"));
  97. }
  98. //关闭索引库
  99. indexReader.close();
  100. }
  101. @Test
  102. public void testNumericRangeQuery() throws Exception {
  103. //创建一个数值范围查询对象
  104. //参数1:要查询的域 参数2:最小值 参数3:最大值 参数4:是否包含最小值 参数5:是否包含最大值
  105. Query query = NumericRangeQuery.newLongRange("size", 1000l, 10000l, false, true);
  106. System.out.println(query);
  107. //打印结果
  108. printResult(getIndexSearcher(), query);
  109. }
  110. @Test
  111. public void testBooleanQuery() throws Exception {
  112. //创建一个BooleanQuery对象
  113. BooleanQuery query = new BooleanQuery();
  114. //创建子查询,文件大于1000小于10000
  115. // Query query1 = NumericRangeQuery.newLongRange("size", 1000l, 10000l, true, true);
  116. Query query1 = new TermQuery(new Term("name", "lucene"));
  117. //文件名中包含mybatis关键字
  118. Query query2 = new TermQuery(new Term("name", "apache"));
  119. //添加到BooleanQuery对象中
  120. query.add(query1, Occur.MUST);
  121. query.add(query2, Occur.MUST_NOT);
  122. System.out.println(query);
  123. //执行查询
  124. printResult(getIndexSearcher(), query);
  125. }
  126. @Test
  127. public void testQueryParser() throws Exception {
  128. //创建一个QueryParser对象。参数1:默认搜索域 参数2:分析器对象。
  129. QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
  130. //调用parse方法可以获得一个Query对象
  131. //参数:要查询的内容,可以是一句话。先分词在查询
  132. Query query = queryParser.parse("mybatis is a apache project");
  133. // Query query = queryParser.parse("name:lucene OR name:apache");
  134. System.out.println(query);
  135. printResult(getIndexSearcher(), query);
  136. }
  137. @Test
  138. public void testMultiFileQueryParser() throws Exception {
  139. //指定默认搜索域
  140. String[] fields ={"name", "content"};
  141. MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
  142. Query query = queryParser.parse("mybatis is a apache project");
  143. System.out.println(query);
  144. printResult(getIndexSear

发表评论

表情:
评论列表 (有 0 条评论,305人围观)

还没有评论,来说两句吧...

相关阅读

    相关 lucene入门

    Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的时为软件开发人员提供一个简单易用的工具包,

    相关 Lucene入门

    > lucene 是一个全文检索引擎的架构,提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。 创建索引库 俩种储存方式: 第一种: //将索引存

    相关 Lucene使用Lucene入门

    本文主要介绍几个方面,为什么使用Lucene使用场景,解决的问题,Lucene的入门使用,以及Lucene一些语法(增删改查)。 一简述Lucene概念:磁盘上的一些邮件,文