• 一个例子学懂搜索引擎(lucene)


    其实,lucene是一个很容易上手的搜索引擎框架,传统的搜索引擎,涉及到爬虫,也就是爬取网页,然后对 网页进行加工,也就是索引,最后用于搜索,lucene这个框架可以很方便的帮你做到后面两个步骤,也就是索引和搜索!本文尝试通过一个例子,使大家掌握 lucene的使用核心方法,包括分词、索引、搜索不同的目录、搜索不同的域,希望大家通过这个实例,对lucene和搜索引擎能有比较全面的认识!

    其实,lucene是一个很容易上手的搜索引擎框架,传统的搜索引擎,涉及到爬虫,也就是爬取网页,然后对网页进行加工,也就是 索引,最后用于搜 索,lucene这个框架可以很方便的帮你做到后面两个步骤,也就是索引和搜索!本文尝试通过一个例子,使大家掌握lucene的使用核心方法,包括分 词、索引、搜索不同的目录、搜索不同的域,希望大家通过这个实例,对lucene和搜索引擎能有比较全面的认识!

    下面是这个例子的代码:
    phz.LuceneTest.java

     
    1. package phz;
    2.  
    3. import org.apache.lucene.analysis.standard.StandardAnalyzer;
    4. import org.apache.lucene.document.Document;
    5. import org.apache.lucene.document.Field;
    6. import org.apache.lucene.index.IndexWriter;
    7. import org.apache.lucene.queryParser.MultiFieldQueryParser;
    8. import org.apache.lucene.search.BooleanClause;
    9. import org.apache.lucene.search.Hits;
    10. import org.apache.lucene.search.IndexSearcher;
    11. import org.apache.lucene.search.MultiSearcher;
    12. import org.apache.lucene.search.Query;
    13.  
    14. /**
    15.  * 这个实例包含了lucene所有核心用法
    16.  *
    17.  * @author panhuizi
    18.  *
    19.  */
    20. public class LuceneTest {
    21.  
    22.     public static void main(String[] args) {
    23.         try {
    24.             LuceneTest luceneTest = new LuceneTest();
    25.             // 创建索引
    26.             luceneTest.index();
    27.             // 在索引所在目录下搜索"中国 金牌"
    28.             luceneTest.search("中国 金牌");
    29.         } catch (Exception e) {
    30.             e.printStackTrace();
    31.         }
    32.         System.out.println("ok");
    33.     }
    34.  
    35.     public void index() throws Exception {
    36.         /* 创建索引初始化,执行这些语句将创建或清空d:\\save\\目录下所有索引 */
    37.         IndexWriter writer1 = new IndexWriter("d:\\save\\",
    38.                 new StandardAnalyzer(), true);
    39.         writer1.close();
    40.  
    41.         /*
    42.          * 往创建的初始化索引中添加索引内容,StandardAnalyzer表示用lucene自带的标准分词机制,
    43.          * false表示不覆盖原来该目录的索引,细心的读者可能已经发现, 这句话和上面的那句就这个false不一样
    44.          */
    45.         IndexWriter writer2 = new IndexWriter("d:\\save\\",
    46.                 new StandardAnalyzer(), false);
    47.         /* 创建一份文件 */
    48.         Document doc1 = new Document();
    49.         /*
    50.          * 创建一个域ArticleTitle,并往这个域里面添加内容 "Field.Store.YES"表示域里面的内容将被存储到索引
    51.          * "Field.Index.TOKENIZED"表示域里面的内容将被索引,以便用来搜索
    52.          */
    53.         Field field1 = new Field("ArticleTitle", "北京2008年奥运会", Field.Store.YES,
    54.                 Field.Index.TOKENIZED);
    55.         /* 往文件里添加这个域 */
    56.         doc1.add(field1);
    57.         /* 同理:创建另外一个域ArticleText,并往这个域里面添加内容 */
    58.         Field field2 = new Field("ArticleText", "这是一届创造奇迹、超越梦想的奥运会.......",
    59.                 Field.Store.YES, Field.Index.TOKENIZED);
    60.         doc1.add(field2);
    61.         // 在这里还可以添加其他域
    62.         /* 添加这份文件到索引 */
    63.         writer2.addDocument(doc1);
    64.  
    65.         /* 同理:创建第二份文件 */
    66.         Document doc2 = new Document();
    67.         field1 = new Field("ArticleTitle", "中国获得全球赞誉", Field.Store.YES,
    68.                 Field.Index.TOKENIZED);
    69.         doc2.add(field1);
    70.         field2 = new Field("ArticleText", "中国所取得的金牌总数排行榜的榜首........",
    71.                 Field.Store.YES, Field.Index.TOKENIZED);
    72.         doc2.add(field2);
    73.  
    74.         writer2.addDocument(doc2);
    75.  
    76.         // 在这里可以添加其他文件
    77.  
    78.         /* 关闭 */
    79.         writer2.close();
    80.     }
    81.  
    82.     public void search(String serchString) throws Exception {
    83.         /* 创建一个搜索,搜索刚才创建的d:\\save\\目录下的索引 */
    84.         IndexSearcher indexSearcher = new IndexSearcher("d:\\save\\");
    85.         /* 在这里我们只需要搜索一个目录 */
    86.         IndexSearcher indexSearchers[] = { indexSearcher };
    87.         /* 我们需要搜索两个域"ArticleTitle", "ArticleText"里面的内容 */
    88.         String[] fields = { "ArticleTitle", "ArticleText" };
    89.         /* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行 */
    90.         BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD,
    91.                 BooleanClause.Occur.SHOULD };
    92.         /*
    93.          * MultiFieldQueryParser表示多个域解析,
    94.          * 同时可以解析含空格的字符串,如果我们搜索"中国 金牌",根据前面的索引,显然搜到的是第二份文件
    95.          */
    96.         Query query = MultiFieldQueryParser.parse(serchString, fields, clauses,
    97.                 new StandardAnalyzer());
    98.         /* Multisearcher表示多目录搜索,在这里我们只有一个目录 */
    99.         MultiSearcher searcher = new MultiSearcher(indexSearchers);
    100.         /* 开始搜索 */
    101.         Hits h = searcher.search(query);
    102.         /* 把搜索出来的所有文件打印出来 */
    103.         for (int i = 0; i < h.length(); i++) {
    104.             /* 打印出文件里面ArticleTitle域里面的内容 */
    105.             System.out.println(h.doc(i).get("ArticleTitle"));
    106.             /* 打印出文件里面ArticleText域里面的内容 */
    107.             System.out.println(h.doc(i).get("ArticleText"));
    108.         }
    109.         /* 关闭 */
    110.         searcher.close();
    111.     }
    112. }
    package phz;  import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.MultiSearcher; import org.apache.lucene.search.Query;  /**  * 这个实例包含了lucene所有核心用法  *   * @author panhuizi  *   */ public class LuceneTest {  	public static void main(String[] args) { 		try { 			LuceneTest luceneTest = new LuceneTest(); 			// 创建索引 			luceneTest.index(); 			// 在索引所在目录下搜索"中国 金牌" 			luceneTest.search("中国 金牌"); 		} catch (Exception e) { 			e.printStackTrace(); 		} 		System.out.println("ok"); 	}  	public void index() throws Exception { 		/* 创建索引初始化,执行这些语句将创建或清空d:\\save\\目录下所有索引 */ 		IndexWriter writer1 = new IndexWriter("d:\\save\\", 				new StandardAnalyzer(), true); 		writer1.close();  		/* 		 * 往创建的初始化索引中添加索引内容,StandardAnalyzer表示用lucene自带的标准分词机制, 		 * false表示不覆盖原来该目录的索引,细心的读者可能已经发现, 这句话和上面的那句就这个false不一样 		 */ 		IndexWriter writer2 = new IndexWriter("d:\\save\\", 				new StandardAnalyzer(), false); 		/* 创建一份文件 */ 		Document doc1 = new Document(); 		/* 		 * 创建一个域ArticleTitle,并往这个域里面添加内容 "Field.Store.YES"表示域里面的内容将被存储到索引 		 * "Field.Index.TOKENIZED"表示域里面的内容将被索引,以便用来搜索 		 */ 		Field field1 = new Field("ArticleTitle", "北京2008年奥运会", Field.Store.YES, 				Field.Index.TOKENIZED); 		/* 往文件里添加这个域 */ 		doc1.add(field1); 		/* 同理:创建另外一个域ArticleText,并往这个域里面添加内容 */ 		Field field2 = new Field("ArticleText", "这是一届创造奇迹、超越梦想的奥运会.......", 				Field.Store.YES, Field.Index.TOKENIZED); 		doc1.add(field2); 		// 在这里还可以添加其他域 		/* 添加这份文件到索引 */ 		writer2.addDocument(doc1);  		/* 同理:创建第二份文件 */ 		Document doc2 = new Document(); 		field1 = new Field("ArticleTitle", "中国获得全球赞誉", Field.Store.YES, 				Field.Index.TOKENIZED); 		doc2.add(field1); 		field2 = new Field("ArticleText", "中国所取得的金牌总数排行榜的榜首........", 				Field.Store.YES, Field.Index.TOKENIZED); 		doc2.add(field2);  		writer2.addDocument(doc2);  		// 在这里可以添加其他文件  		/* 关闭 */ 		writer2.close(); 	}  	public void search(String serchString) throws Exception { 		/* 创建一个搜索,搜索刚才创建的d:\\save\\目录下的索引 */ 		IndexSearcher indexSearcher = new IndexSearcher("d:\\save\\"); 		/* 在这里我们只需要搜索一个目录 */ 		IndexSearcher indexSearchers[] = { indexSearcher }; 		/* 我们需要搜索两个域"ArticleTitle", "ArticleText"里面的内容 */ 		String[] fields = { "ArticleTitle", "ArticleText" }; 		/* 下面这个表示要同时搜索这两个域,而且只要一个域里面有满足我们搜索的内容就行 */ 		BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, 				BooleanClause.Occur.SHOULD }; 		/* 		 * MultiFieldQueryParser表示多个域解析, 		 * 同时可以解析含空格的字符串,如果我们搜索"中国 金牌",根据前面的索引,显然搜到的是第二份文件 		 */ 		Query query = MultiFieldQueryParser.parse(serchString, fields, clauses, 				new StandardAnalyzer()); 		/* Multisearcher表示多目录搜索,在这里我们只有一个目录 */ 		MultiSearcher searcher = new MultiSearcher(indexSearchers); 		/* 开始搜索 */ 		Hits h = searcher.search(query); 		/* 把搜索出来的所有文件打印出来 */ 		for (int i = 0; i < h.length(); i++) { 			/* 打印出文件里面ArticleTitle域里面的内容 */ 			System.out.println(h.doc(i).get("ArticleTitle")); 			/* 打印出文件里面ArticleText域里面的内容 */ 			System.out.println(h.doc(i).get("ArticleText")); 		} 		/* 关闭 */ 		searcher.close(); 	} } 

    附件中每一步骤都有比较详细的说明!
    关于lucene,有任何疑问,都可以提出来,大家一起交流!

    • luceneTest.rar (594.2 KB)
    • 描述: 这个实例包含了lucene所有核心用法
    • 下载次数: 375

    转载自:http://phz50.javaeye.com/blog/232429

  • 相关阅读:
    学习笔记 css3--选择器&新增颜色模式&文本相关
    HTML5之新增标签用途及应用场景
    js中邦定事件与解绑支持匿名函数
    常用网站开发类Firefox扩展插件 (转)
    使用Easy4net编写代码生成器
    jQuery分页插件jBootstrapPage,一个Bootstrap风格的分页插件
    使用jQuery插件jRemoteValidate进行远程ajax验证,可以自定义返回的信息
    (新)自己动手写ORM框架(1)-增删查改的使用
    (3) iOS开发之UI处理-UIView篇
    (2) iOS开发之UI处理-UILabel篇
  • 原文地址:https://www.cnblogs.com/ziyan22/p/1875066.html
Copyright © 2020-2023  润新知