Lucene入门

ゝ一纸荒年。 2022-05-28 07:05 261阅读 0赞

lucene 是一个全文检索引擎的架构,提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。

创建索引库

俩种储存方式:
第一种:

  1. //将索引存储到内存
  2. Directory ramDirectory = new RAMDirectory();

第二种:

  1. //将索引存储到硬盘
  2. Directory fileDirectory = FSDirectory.open(Paths.get("f:\\testindex"));

创建IndexWriter

  1. //创建分词器(此处采用标注分词器)
  2. Analyzer analyzer = new StandardAnalyzer();
  3. //写入索引库
  4. IndexWriterConfig config = new IndexWriterConfig(analyzer);
  5. //操作内存IndexWriter
  6. IndexWriter iwriter = new IndexWriter(ramDirectory, config);
  7. //操作文件的IndexWriter
  8. IndexWriter fileIndexWriter = new IndexWriter(fileDirectory, config);

创建Document

可以采用Object进行添加数据,不一定只能用数组;

  1. String[] texts = new String[]{
  2. "Mybatis分页插件 - 示例",
  3. "Mybatis 贴吧问答 第一期",
  4. "Mybatis 示例之 复杂(complex)属性(property)",
  5. "Mybatis极其(最)简(好)单(用)的一个分页插件",
  6. "Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题",
  7. "Mybatis 示例之 foreach (下)",
  8. "Mybatis 示例之 foreach (上)",
  9. "Mybatis 示例之 SelectKey",
  10. "Mybatis 示例之 Association (2)",
  11. "Mybatis 示例之 Association",
  12. "大家好我是来自中日友好医院神经内科的医生"
  13. "我已经是工作四年主要擅长的领域在神经内科很高兴在工作室里为大家做一些疾病知识科普健康教育方面的事情"
  14. "希望大家能够从中了解到相关的疾病知识提升自我的健康管理意识帮助大家能够很好地与法治管理相关的病"
  15. };
  16. for (String text : texts) {
  17. Document doc = new Document();TextField.TYPE_STORED));
  18. doc.add(new TextField("title", text, Field.Store.YES));
  19. doc.add(new StringField("isbn", ""+String.valueOf(Math.random()), Field.Store.YES));
  20. iwriter.addDocument(doc);
  21. }

读取索引并查询

  1. DirectoryReader reader = DirectoryReader.open(fileDirectory);
  2. IndexSearcher isearcher = new IndexSearcher(reader);
  3. //解析一个简单的查询
  4. QueryParser parser = new QueryParser("title", analyzer);
  5. Query query = parser.parse("内科医生 ");
  6. ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs;
  7. //迭代输出结果
  8. for (int i = 0; i < hits.length; i++) {
  9. Document hitDoc = isearcher.doc(hits[i].doc);
  10. System.out.println(hitDoc.get("title"));
  11. System.out.println(hitDoc.get("isbn"));
  12. }

完整示例

内存索引库优点:读取速度快
文件索引库:长时间存储
下面就是结合的示例

  1. import java.io.IOException;
  2. import java.nio.file.Paths;
  3. import org.apache.lucene.analysis.Analyzer;
  4. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  5. import org.apache.lucene.document.Document;
  6. import org.apache.lucene.document.Field;
  7. import org.apache.lucene.document.StringField;
  8. import org.apache.lucene.document.TextField;
  9. import org.apache.lucene.index.DirectoryReader;
  10. import org.apache.lucene.index.IndexWriter;
  11. import org.apache.lucene.index.IndexWriterConfig;
  12. import org.apache.lucene.queryparser.classic.ParseException;
  13. import org.apache.lucene.queryparser.classic.QueryParser;
  14. import org.apache.lucene.search.IndexSearcher;
  15. import org.apache.lucene.search.Query;
  16. import org.apache.lucene.search.ScoreDoc;
  17. import org.apache.lucene.store.Directory;
  18. import org.apache.lucene.store.FSDirectory;
  19. import org.apache.lucene.store.RAMDirectory;
  20. public class IndexProcessor {
  21. public static void main(String[] args) throws IOException,ParseException {
  22. Analyzer analyzer = new StandardAnalyzer();
  23. //将索引存储到内存中
  24. Directory ramDirectory = new RAMDirectory();
  25. //如下想把索引存储到硬盘上,使用下面的代码代替
  26. Directory fileDirectory = FSDirectory.open(Paths.get("f:\\testindex"));
  27. //写入索引库
  28. IndexWriterConfig config = new IndexWriterConfig(analyzer);
  29. //操作内存IndexWriter
  30. IndexWriter iwriter = new IndexWriter(ramDirectory, config);
  31. //操作文件的IndexWriter
  32. IndexWriter fileIndexWriter = new IndexWriter(fileDirectory, config);
  33. String[] texts = new String[]{
  34. "Mybatis分页插件 - 示例",
  35. "Mybatis 贴吧问答 第一期",
  36. "Mybatis 示例之 复杂(complex)属性(property)",
  37. "Mybatis极其(最)简(好)单(用)的一个分页插件",
  38. "Mybatis 的Log4j日志输出问题 - 以及有关日志的所有问题",
  39. "Mybatis 示例之 foreach (下)",
  40. "Mybatis 示例之 foreach (上)",
  41. "Mybatis 示例之 SelectKey",
  42. "Mybatis 示例之 Association (2)",
  43. "Mybatis 示例之 Association",
  44. "大家好我是来自中日友好医院神经内科的医生",
  45. "我已经是工作四年主要擅长的领域在神经内科很高兴在工作室里为大家做一些疾病知识科普健康教育方面的事情",
  46. "希望大家能够从中了解到相关的疾病知识提升自我的健康管理意识帮助大家能够很好地与法治管理相关的病"
  47. };
  48. for (String text : texts) {
  49. Document doc = new Document();
  50. // doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
  51. doc.add(new TextField("title", text, Field.Store.YES));
  52. doc.add(new StringField("isbn", ""+String.valueOf(Math.random()), Field.Store.YES));
  53. iwriter.addDocument(doc);
  54. }
  55. iwriter.close();
  56. //读取索引并查询
  57. DirectoryReader reader = DirectoryReader.open(fileDirectory);
  58. IndexSearcher isearcher = new IndexSearcher(reader);
  59. //解析一个简单的查询
  60. QueryParser parser = new QueryParser("title", analyzer);
  61. Query query = parser.parse("内科医生 ");
  62. ScoreDoc[] hits = isearcher.search(query, 1000).scoreDocs;
  63. //迭代输出结果
  64. for (int i = 0; i < hits.length; i++) {
  65. Document hitDoc = isearcher.doc(hits[i].doc);
  66. System.out.println(hitDoc.get("title"));
  67. System.out.println(hitDoc.get("isbn"));
  68. }
  69. reader.close();
  70. ramDirectory.close();
  71. }
  72. }

发表评论

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

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

相关阅读

    相关 lucene入门

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

    相关 Lucene入门

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

    相关 Lucene的使用,Lucene入门

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

    相关 lucene入门(三)

    前面两篇文章介绍了如何创建索引和搜索索引,理解了的话基本上就已经可以使用Lucene进行简单的全文检索了。学习完lucene之后,我个人有一个小小的demo,只是为了练习,在这