Lucene4.3入门

举报
香菜聊游戏 发表于 2021/07/15 02:46:50 2021/07/15
【摘要】       辞职交接期间无聊看了一下搜索引擎,java社区比较火的当然是Lucene,想写一个简单的小例子,在网上找了些资料,不过都不是4.3的,自己看了一下。 下载地址:http://lucene.apache.org/core/ 项目结构 constans.java 是常量类 LuceneIndex.java 建立索引类 ...

      辞职交接期间无聊看了一下搜索引擎,java社区比较火的当然是Lucene,想写一个简单的小例子,在网上找了些资料,不过都不是4.3的,自己看了一下。

下载地址:http://lucene.apache.org/core/

项目结构


constans.java 是常量类

LuceneIndex.java 建立索引类

LuceneSearch.java 搜索类

数据文件:




  
  1. package com.xin;
  2. public class Constants {
  3. public final static String INDEX_FILE_PATH = "e:\\lucene\\test"; //索引的文件的存放路径
  4. public final static String INDEX_STORE_PATH = "e:\\lucene\\index"; //索引的存放位置
  5. }


  
  1. package com.xin;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.InputStreamReader;
  6. import java.io.Reader;
  7. import java.util.Date;
  8. import org.apache.lucene.analysis.Analyzer;
  9. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  10. import org.apache.lucene.document.Document;
  11. import org.apache.lucene.document.Field;
  12. import org.apache.lucene.document.StringField;
  13. import org.apache.lucene.document.TextField;
  14. import org.apache.lucene.index.IndexWriter;
  15. import org.apache.lucene.index.IndexWriterConfig;
  16. import org.apache.lucene.index.IndexWriterConfig.OpenMode;
  17. import org.apache.lucene.store.Directory;
  18. import org.apache.lucene.store.FSDirectory;
  19. import org.apache.lucene.util.Version;
  20. /**
  21. * @author chongxin
  22. * @since 2013/6/19
  23. * @version Lucene 4.3.1
  24. * */
  25. public class LuceneIndex {
  26. // 索引器
  27. private IndexWriter writer = null;
  28. public LuceneIndex() {
  29. try {
  30. //索引文件的保存位置
  31. Directory dir = FSDirectory.open(new File(Constants.INDEX_STORE_PATH));
  32. //分析器
  33. Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
  34. //配置类
  35. IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_40,analyzer);
  36. iwc.setOpenMode(OpenMode.CREATE);//创建模式 OpenMode.CREATE_OR_APPEND 添加模式
  37. writer = new IndexWriter(dir, iwc);
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. // 将要建立索引的文件构造成一个Document对象,并添加一个域"content"
  43. private Document getDocument(File f) throws Exception {
  44. Document doc = new Document();
  45. FileInputStream is = new FileInputStream(f);
  46. Reader reader = new BufferedReader(new InputStreamReader(is));
  47. //字符串 StringField LongField TextField
  48. Field pathField = new StringField("path", f.getAbsolutePath(),Field.Store.YES);
  49. Field contenField = new TextField("contents", reader);
  50. //添加字段
  51. doc.add(contenField);
  52. doc.add(pathField);
  53. return doc;
  54. }
  55. public void writeToIndex() throws Exception {
  56. File folder = new File(Constants.INDEX_FILE_PATH);
  57. if (folder.isDirectory()) {
  58. String[] files = folder.list();
  59. for (int i = 0; i < files.length; i++) {
  60. File file = new File(folder, files[i]);
  61. Document doc = getDocument(file);
  62. System.out.println("正在建立索引 : " + file + "");
  63. writer.addDocument(doc);
  64. }
  65. }
  66. }
  67. public void close() throws Exception {
  68. writer.close();
  69. }
  70. public static void main(String[] args) throws Exception {
  71. // 声明一个对象
  72. LuceneIndex indexer = new LuceneIndex();
  73. // 建立索引
  74. Date start = new Date();
  75. indexer.writeToIndex();
  76. Date end = new Date();
  77. System.out.println("建立索引用时" + (end.getTime() - start.getTime()) + "毫秒");
  78. indexer.close();
  79. }
  80. }

  
  1. 正在建立索引 : e:\lucene\test\a.txt
  2. 正在建立索引 : e:\lucene\test\b.txt
  3. 正在建立索引 : e:\lucene\test\c.txt
  4. 正在建立索引 : e:\lucene\test\d.txt
  5. 建立索引用时109毫秒

生成的索引文件:


查找:


  
  1. package com.xin;
  2. import java.io.File;
  3. import java.util.Date;
  4. import org.apache.lucene.analysis.Analyzer;
  5. import org.apache.lucene.analysis.standard.StandardAnalyzer;
  6. import org.apache.lucene.document.Document;
  7. import org.apache.lucene.index.DirectoryReader;
  8. import org.apache.lucene.index.IndexReader;
  9. import org.apache.lucene.queryparser.classic.QueryParser;
  10. import org.apache.lucene.search.IndexSearcher;
  11. import org.apache.lucene.search.Query;
  12. import org.apache.lucene.search.ScoreDoc;
  13. import org.apache.lucene.search.TopDocs;
  14. import org.apache.lucene.store.FSDirectory;
  15. import org.apache.lucene.util.Version;
  16. /**
  17. * @author chongxin
  18. * @since 2013/6/19
  19. * @version Lucene 4.3.1
  20. * */
  21. public class LuceneSearch {
  22. // 声明一个IndexSearcher对象
  23. private IndexSearcher searcher = null;
  24. // 声明一个Query对象
  25. private Query query = null;
  26. private String field = "contents";
  27. public LuceneSearch() {
  28. try {
  29. IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(Constants.INDEX_STORE_PATH)));
  30. searcher = new IndexSearcher(reader);
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. //返回查询结果
  36. public final TopDocs search(String keyword) {
  37. System.out.println("正在检索关键字 : " + keyword);
  38. try {
  39. Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
  40. QueryParser parser = new QueryParser(Version.LUCENE_40, field,analyzer);
  41. // 将关键字包装成Query对象
  42. query = parser.parse(keyword);
  43. Date start = new Date();
  44. TopDocs results = searcher.search(query, 5 * 2);
  45. Date end = new Date();
  46. System.out.println("检索完成,用时" + (end.getTime() - start.getTime())
  47. + "毫秒");
  48. return results;
  49. } catch (Exception e) {
  50. e.printStackTrace();
  51. return null;
  52. }
  53. }
  54. //打印结果
  55. public void printResult(TopDocs results) {
  56. ScoreDoc[] h = results.scoreDocs;
  57. if (h.length == 0) {
  58. System.out.println("对不起,没有找到您要的结果。");
  59. } else {
  60. for (int i = 0; i < h.length; i++) {
  61. try {
  62. Document doc = searcher.doc(h[i].doc);
  63. System.out.print("这是第" + i + "个检索到的结果,文件名为:");
  64. System.out.println(doc.get("path"));
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. }
  68. }
  69. }
  70. System.out.println("--------------------------");
  71. }
  72. public static void main(String[] args) throws Exception {
  73. LuceneSearch test = new LuceneSearch();
  74. TopDocs h = null;
  75. h = test.search("中国");
  76. test.printResult(h);
  77. h = test.search("人民");
  78. test.printResult(h);
  79. h = test.search("共和国");
  80. test.printResult(h);
  81. }
  82. }


文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/9128323

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。