空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

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

          posted on 2008-10-14 18:34 蘆葦 閱讀(312) 評論(0)  編輯  收藏 所屬分類: JAVA
          主站蜘蛛池模板: 抚州市| 扶余县| 黔江区| 中卫市| 台东县| 苍南县| 阜康市| 五台县| 封丘县| 晴隆县| 上思县| 石首市| 定安县| 东源县| 乌兰县| 怀安县| 广西| 易门县| 灵川县| 杨浦区| 临城县| 札达县| 奉化市| 定日县| 平阳县| 夏河县| 许昌市| 囊谦县| 句容市| 新宁县| 湾仔区| 孟州市| 犍为县| 彩票| 揭西县| 开远市| 都匀市| 堆龙德庆县| 临夏县| 台安县| 枣强县|