日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/17 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个例子学懂搜索引擎(lucene) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.vifir.com/html/20080827/1703937.html

一個例子學懂搜索引擎(lucene) 來源:javaeye 作者: phz50 2008-08-27 16:44:40.0網友評論:0 點擊:8996 其實,lucene是一個很容易上手的搜索引擎框架,傳統的搜索引擎,涉及到爬蟲,也就是爬取網頁,然后對網頁進行加工,也就是索引,最后用于搜索,lucene這個框架可以很方便的幫你做到后面兩個步驟,也就是索引和搜索!本文嘗試通過一個例子,使大家掌握lucene的使用核心方法,包括分詞、索引、搜索不同的目錄、搜索不同的域,希望大家通過這個實例,對lucene和搜索引擎能有比較全面的認識!

其實,lucene是一個很容易上手的搜索引擎框架,傳統的搜索引擎,涉及到爬蟲,也就是爬取網頁,然后對網頁進行加工,也就是索引,最后用于搜 索,lucene這個框架可以很方便的幫你做到后面兩個步驟,也就是索引和搜索!本文嘗試通過一個例子,使大家掌握lucene的使用核心方法,包括分 詞、索引、搜索不同的目錄、搜索不同的域,希望大家通過這個實例,對lucene和搜索引擎能有比較全面的認識!

下面是這個例子的代碼:
phz.LuceneTest.java

  • 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();
  • ????}
  • }
  • 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

    其實,lucene是一個很容易上手的搜索引擎框架,傳統的搜索引擎,涉及到爬蟲,也就是爬取網頁,然后對網頁進行加工,也就是索引,最后用于搜 索,lucene這個框架可以很方便的幫你做到后面兩個步驟,也就是索引和搜索!本文嘗試通過一個例子,使大家掌握lucene的使用核心方法,包括分 詞、索引、搜索不同的目錄、搜索不同的域,希望大家通過這個實例,對lucene和搜索引擎能有比較全面的認識!

    下面是這個例子的代碼:
    phz.LuceneTest.java

  • 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();
  • ????}
  • }
  • 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

    ?

    總結

    以上是生活随笔為你收集整理的一个例子学懂搜索引擎(lucene)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。