<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 154  文章 - 60  trackbacks - 0
    <2008年3月>
    2425262728291
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    聲明:

    該blog是為了收集資料,認識朋友,學習、提高技術,所以本blog的內容除非聲明,否則一律為轉載!!

    感謝那些公開自己技術成果的高人們!!!

    支持開源,尊重他人的勞動!!

    常用鏈接

    留言簿(3)

    隨筆分類(148)

    隨筆檔案(143)

    收藏夾(2)

    其他

    學習(技術)

    觀察思考(非技術)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    搜索篇:lucene的簡單實例<一>
    原文地址:http://www.javaeye.com/topic/39597

    說明一下,這一篇文章的用到的lucene,是用2.0版本的,主要在查詢的時候2.0版本的lucene與以前的版本有了一些區別.
    其實這一些代碼都是早幾個月寫的,自己很懶,所以到今天才寫到自己的博客上,高深的文章自己寫不了,只能記錄下一些簡單的記錄與點滴,其中的代碼算是自娛自樂的,希望高手不要把重構之類的砸下來...

    1、在windows系統下的的C盤,建一個名叫s的文件夾,在該文件夾里面隨便建三個txt文件,隨便起名啦,就叫"1.txt","2.txt"和"3.txt"啦
    其中1.txt的內容如下:
    1. 中華人民共和國   
    2. 全國人民   
    3. 2006年  
    而"2.txt"和"3.txt"的內容也可以隨便寫幾寫,這里懶寫,就復制一個和1.txt文件的內容一樣吧

    2、下載lucene包,放在classpath路徑中
    建立索引:

    java代碼:
    package lighter.javaeye.com;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Date;

    import org.apache.lucene.analysis.Analyzer;
    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;

    /**
     * author lighter date 2006-8-7
     
    */

    public class TextFileIndexer {
        
    public static void main(String[] args) throws Exception {
            
    /* 指明要索引文件夾的位置,這里是C盤的S文件夾下 */
            File fileDir 
    = new File("c:\\s");

            
    /* 這里放索引文件的位置 */
            File indexDir 
    = new File("c:\\index");
            Analyzer luceneAnalyzer 
    = new StandardAnalyzer();
            IndexWriter indexWriter 
    = new IndexWriter(indexDir, luceneAnalyzer,
                    
    true);
            File[] textFiles 
    = fileDir.listFiles();
            
    long startTime = new Date().getTime();
            
            
    //增加document到索引去
            for (int i = 0; i < textFiles.length; i++{
                
    if (textFiles[i].isFile()
                        
    && textFiles[i].getName().endsWith(".txt")) {
                    System.out.println(
    "File " + textFiles[i].getCanonicalPath()
                            
    + "正在被索引.");
                    String temp 
    = FileReaderAll(textFiles[i].getCanonicalPath(),
                            
    "GBK");
                    System.out.println(temp);
                    Document document 
    = new Document();
                    Field FieldPath 
    = new Field("path", textFiles[i].getPath(),
                            Field.Store.YES, Field.Index.NO);
                    Field FieldBody 
    = new Field("body", temp, Field.Store.YES,
                            Field.Index.TOKENIZED,
                            Field.TermVector.WITH_POSITIONS_OFFSETS);
                    document.add(FieldPath);
                    document.add(FieldBody);
                    indexWriter.addDocument(document);
                }

            }

            
    //optimize()方法是對索引進行優化
            indexWriter.optimize();
            indexWriter.close();
            
            
    //測試一下索引的時間
            long endTime = new Date().getTime();
            System.out
                    .println(
    "這花費了"
                            
    + (endTime - startTime)
                            
    + " 毫秒來把文檔增加到索引里面去!"
                            
    + fileDir.getPath());
        }


        
    public static String FileReaderAll(String FileName, String charset)
                
    throws IOException {
            BufferedReader reader 
    = new BufferedReader(new InputStreamReader(
                    
    new FileInputStream(FileName), charset));
            String line 
    = new String();
            String temp 
    = new String();
            
            
    while ((line = reader.readLine()) != null{
                temp 
    += line;
            }

            reader.close();
            
    return temp;
        }

    }

    索引的結果:
    File C:\s\1.txt正在被索引.
    中華人民共和國全國人民2006年
    File C:\s\
    2.txt正在被索引.
    中華人民共和國全國人民2006年
    File C:\s\
    3.txt正在被索引.
    中華人民共和國全國人民2006年
    這花費了297 毫秒來把文檔增加到索引里面去
    !c:\s

    3、建立了索引之后,查詢啦....

    java代碼:
    package lighter.javaeye.com;

    import java.io.IOException;

    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;
    import org.apache.lucene.queryParser.ParseException;
    import org.apache.lucene.queryParser.QueryParser;
    import org.apache.lucene.search.Hits;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;

    public class TestQuery {
        
    public static void main(String[] args) throws IOException, ParseException {
            Hits hits 
    = null;
            String queryString 
    = "中華";
            Query query 
    = null;
            IndexSearcher searcher 
    = new IndexSearcher("c:\\index");

            Analyzer analyzer 
    = new StandardAnalyzer();
            
    try {
                QueryParser qp 
    = new QueryParser("body", analyzer);
                query 
    = qp.parse(queryString);
            }
     catch (ParseException e) {
            }

            
    if (searcher != null{
                hits 
    = searcher.search(query);
                
    if (hits.length() > 0{
                    System.out.println(
    "找到:" + hits.length() + " 個結果!");
                }

            }

        }


    }

    其運行結果:
    找到:3 個結果!

    具體的API的用法,這里就不說了,具體的做法參考lucene的官方文檔吧...


    注:lucene2.0的API 與lucene1.4.3的API 有了一些區別. (例子中用到的)

    這是lucene2.0的API
     QueryParser qp = new QueryParser("body", analyzer);   
     query 
    = qp.parse(queryString);   

    這是lucene1.4.3版的API
     query = QueryParser.parse(key,queryString,new new StandardAnalyzer());


    ================================

    搜索篇:lucene的簡單實例<二>

    原文地址:http://www.javaeye.com/post/190576

    寫文章的時候,感覺比較難寫的就是標題,有時候不知道起什么名字好,反正這里寫的都是關于lucene的一些簡單的實例,就隨便起啦.

    Lucene 其實很簡單的,它最主要就是做兩件事:建立索引和進行搜索
    來看一些在lucene中使用的術語,這里并不打算作詳細的介紹,只是點一下而已----因為這一個世界有一種好東西,叫搜索。

    IndexWriter:lucene中最重要的的類之一,它主要是用來將文檔加入索引,同時控制索引過程中的一些參數使用。

    Analyzer:分析器,主要用于分析搜索引擎遇到的各種文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

    Directory:索引存放的位置;lucene提供了兩種索引存放的位置,一種是磁盤,一種是內存。一般情況將索引放在磁盤上;相應地lucene提供了FSDirectory和RAMDirectory兩個類。

    Document:文檔;Document相當于一個要進行索引的單元,任何可以想要被索引的文件都必須轉化為Document對象才能進行索引。

    Field:字段。

    IndexSearcher:是lucene中最基本的檢索工具,所有的檢索都會用到IndexSearcher工具;

    Query:查詢,lucene中支持模糊查詢,語義查詢,短語查詢,組合查詢等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些類。

    QueryParser: 是一個解析用戶輸入的工具,可以通過掃描用戶輸入的字符串,生成Query對象。

    Hits:在搜索完成之后,需要把搜索結果返回并顯示給用戶,只有這樣才算是完成搜索的目的。在lucene中,搜索的結果的集合是用Hits類的實例來表示的。

    上面作了一大堆名詞解釋,下面就看幾個簡單的實例吧:
    1、簡單的的StandardAnalyzer測試例子

    java代碼:
    package lighter.javaeye.com;

    import java.io.IOException;
    import java.io.StringReader;

    import org.apache.lucene.analysis.Analyzer;
    import org.apache.lucene.analysis.Token;
    import org.apache.lucene.analysis.TokenStream;
    import org.apache.lucene.analysis.standard.StandardAnalyzer;

    public class StandardAnalyzerTest 
    {
        
    //構造函數,
        public StandardAnalyzerTest()
        
    {
        }

        
    public static void main(String[] args) 
        
    {
            
    //生成一個StandardAnalyzer對象
            Analyzer aAnalyzer = new StandardAnalyzer();
            
    //測試字符串
            StringReader sr = new StringReader("lighter javaeye com is the are on");
            
    //生成TokenStream對象
            TokenStream ts = aAnalyzer.tokenStream("name", sr);    
            
    try {
                
    int i=0;
                Token t 
    = ts.next();
                
    while(t!=null)
                
    {
                    
    //輔助輸出時顯示行號
                    i++;
                    
    //輸出處理后的字符
                    System.out.println(""+i+"行:"+t.termText());
                    
    //取得下一個字符
                    t=ts.next();
                }

            }
     catch (IOException e) {
                e.printStackTrace();
            }

        }

    }


    顯示結果:
    第1行:lighter 
    第2行:javaeye 
    第3行:com

    提示一下:
    StandardAnalyzer是lucene中內置的"標準分析器",可以做如下功能:
    1、對原有句子按照空格進行了分詞
    2、所有的大寫字母都可以能轉換為小寫的字母
    3、可以去掉一些沒有用處的單詞,例如"is","the","are"等單詞,也刪除了所有的標點
    查看一下結果與"new StringReader("lighter javaeye com is the are on")"作一個比較就清楚明了。
    這里不對其API進行解釋了,具體見lucene的官方文檔。需要注意一點,這里的代碼使用的是lucene2的API,與1.43版有一些明顯的差別。

    2、看另一個實例,簡單地建立索引,進行搜索
    java代碼:
    package lighter.javaeye.com;
    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.QueryParser;
    import org.apache.lucene.search.Hits;
    import org.apache.lucene.search.IndexSearcher;
    import org.apache.lucene.search.Query;
    import org.apache.lucene.store.FSDirectory;

    public class FSDirectoryTest {

        
    //建立索引的路徑
        public static final String path = "c:\\index2";

        
    public static void main(String[] args) throws Exception {
            Document doc1 
    = new Document();
            doc1.add( 
    new Field("name""lighter javaeye com",Field.Store.YES,Field.Index.TOKENIZED));

            Document doc2 
    = new Document();
            doc2.add(
    new Field("name""lighter blog",Field.Store.YES,Field.Index.TOKENIZED));

            IndexWriter writer 
    = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);
            writer.setMaxFieldLength(
    3);
            writer.addDocument(doc1);
            writer.setMaxFieldLength(
    3);
            writer.addDocument(doc2);
            writer.close();

            IndexSearcher searcher 
    = new IndexSearcher(path);
            Hits hits 
    = null;
            Query query 
    = null;
            QueryParser qp 
    = new QueryParser("name",new StandardAnalyzer());
            
            query 
    = qp.parse("lighter");
            hits 
    = searcher.search(query);
            System.out.println(
    "查找\"lighter\" 共" + hits.length() + "個結果");

            query 
    = qp.parse("javaeye");
            hits 
    = searcher.search(query);
            System.out.println(
    "查找\"javaeye\" 共" + hits.length() + "個結果");

        }


    }

    運行結果:

    查找"lighter" 共2個結果
    查找
    "javaeye" 共1個結果

    posted on 2008-03-10 11:04 lk 閱讀(415) 評論(0)  編輯  收藏 所屬分類: j2se
    主站蜘蛛池模板: 亚洲AV无码精品色午夜在线观看| 亚洲精品永久www忘忧草| 久久久久久成人毛片免费看 | 哒哒哒免费视频观看在线www| 一级一片免费视频播放| 精品国产_亚洲人成在线高清| 777爽死你无码免费看一二区| 狠狠色伊人亚洲综合网站色| 亚洲人成影院在线观看| 182tv免费观看在线视频| 精品亚洲成A人在线观看青青| 国产成人亚洲综合色影视 | 亚洲va久久久噜噜噜久久狠狠| 国产四虎免费精品视频| 特级无码毛片免费视频 | 成人嫩草影院免费观看| 久久亚洲精品无码aⅴ大香| 日韩一级在线播放免费观看| 大地影院MV在线观看视频免费| 亚洲偷自精品三十六区| 亚洲综合色成在线播放| 黄色成人网站免费无码av| 美女被免费网站91色| 亚洲国产精品成人综合色在线| 亚洲国产精品无码久久SM| 国产人成免费视频| 国产免费不卡视频| a级成人毛片免费视频高清| 亚洲av成人片在线观看| 亚洲校园春色小说| 国产精品亚洲片在线| 四只虎免费永久观看| 蜜桃视频在线观看免费网址入口| 精品国产污污免费网站| 国产精品亚洲一区二区在线观看 | 久久这里只有精品国产免费10| 国产在线观a免费观看| 久久亚洲中文字幕无码| 亚洲人成电影在线观看网| 亚洲动漫精品无码av天堂| 可以免费观看一级毛片黄a |