IKanalyzer3.2的問題

使用IKanalyzer3.2+lucene3.0搜索一個文本內容,結果只能出現一條,其實能匹配很多條,下面是源代碼

 

package com.lucene.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;

public class CopyOfIKanalyzerDemoToo {

 // 數據文件夾  
 private static final String DATA_DIR = "d:\\test\\file";
 // 索引存放文件夾  
 private static final String INDEX_DIR = "d:\\test\\index";
 // 字段  
 private static final String FIELD_NAME = "content";
 //是否要優化
 private static boolean optimize = true;

 public static void main(String[] args) throws Exception {
  createIndex();
//  search("共和國", "content");
 }

 public static void createIndex() throws Exception {
  boolean create = true;//是否重新創建索引文件,false:在原有的基礎上追加
  Analyzer analyzer = new IKAnalyzer(); //IK中文分詞器
  //創建索引
  IndexWriter indexWriter = new IndexWriter(FSDirectory.open(new File(
    INDEX_DIR)), analyzer, create,
    IndexWriter.MaxFieldLength.UNLIMITED);
  System.out.println("正在創建索引文件....");
  long startTime = new Date().getTime();
  indexDoc(indexWriter, new File(DATA_DIR));
  if (optimize) {
   indexWriter.optimize();
  }
  //最後關閉索引

  indexWriter.close();
  System.out.println("創建索引文件完成....總共花費時間:"
    + (new Date().getTime() - startTime));
 }

 public static void search(String query_str, String field) throws Exception {
  IndexReader reader = IndexReader.open(FSDirectory.open(new File(
    INDEX_DIR)), true);

  IndexSearcher searcher = new IndexSearcher(reader);

  searcher.setSimilarity(new IKSimilarity()); //在索引器中使用IKSimilarity相似度評估器

  
  Query query = IKQueryParser.parse(field, query_str); //IKQueryParser多個字段搜索 


  IKAnalyzer analyzer = new IKAnalyzer();


  TopScoreDocCollector topCollector = TopScoreDocCollector.create(
    searcher.maxDoc(), false);

  searcher.search(query, topCollector);

  ScoreDoc[] docs = topCollector.topDocs().scoreDocs;

  //關鍵字高亮顯示的html標籤,需要導入lucene-highlighter-3.0.3.jar

  SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(
    "<font color='red'>", "</font>");

  Highlighter highlighter = new Highlighter(simpleHTMLFormatter,
    new QueryScorer(query));

  for (int i = 0; i < docs.length; i++) {

   Document doc = searcher.doc(docs[i].doc);

   TokenStream tokenStream1 = analyzer.tokenStream("content",
     new StringReader(doc.get("content")));

   String content = highlighter.getBestFragment(tokenStream1, doc
     .get("content"));
   System.out.println("評分:" + docs[i].score);
   System.out.println("路徑:" + doc.get("path"));
   System.out.println("內容:" + content);


  }

  reader.close(); //關閉索引  

  System.out.println("總共檢索到記錄:" + docs.length);

 }

 private static void indexDoc(IndexWriter writer, File root) {
  // 不去索引不能讀的文件  
  if (root.canRead()) {
   if (root.isDirectory()) {
    File[] files = root.listFiles();
    if (files.length != 0) {
     for (int i = 0; i < files.length; i++) {
      // 遞歸調用  
      indexDoc(writer, files[i]);
     }
    }
   } else {
    try {
     // 文件的文本內容  
     InputStream in = new FileInputStream(root);
     byte b[] = new byte[in.available()];
     in.read(b);
     String content = new String(b, "GBK");
     System.out.println("" + content);
     // 創建一個lucene document  
     Document d = new Document();
     // 把文件的文本內容添加進來 進行索引,保存  
     d.add(new Field(FIELD_NAME, content, Field.Store.YES,
       Field.Index.ANALYZED,
       Field.TermVector.WITH_POSITIONS_OFFSETS));
     // 同時把path也加入進來,只存儲,不索引  
     d.add(new Field("path", root.getAbsolutePath(),
       Field.Store.YES, Field.Index.NOT_ANALYZED));
     // 把document寫入索引文件  
     writer.addDocument(d);
     System.out.println("add file: " + root.getAbsolutePath());
    } catch (FileNotFoundException e) {
     System.out.println("file not found, ignored.");
     e.printStackTrace();
    } catch (IOException e) {

    }
   }
  }
 }

}

 結果如下:

 

中華人民共和國(英文:The People's Republic of China,通常簡稱爲中國(英文:China)[5],

 

位於亞洲東部、太平洋西岸,陸上從東北至西南分別與朝鮮、俄羅斯、蒙古、哈薩克斯坦、吉爾吉斯斯坦、塔吉克斯坦、
阿富汗、巴基斯坦、印度、尼泊爾、不丹、緬甸、老撾和越南等國家接壤,海上從東部至南部分別隔黃海、東海、南海與朝鮮半島、日本列島以及東南亞相望,是世界上陸地鄰國最多的國家,首都北京。國土遼闊,實際控制總面積約爲959.67萬平方千米[3](實際管轄區域),僅次於俄羅斯、加拿大而居世界第三;陸地總面積(不計河、湖)約932.64萬平方千米,僅次於俄羅斯而列世界第二[6];中華人民共和國將行政區劃分爲23個省、5個少數民族自治區、4個直轄市、以及2個特別行政區,但臺灣不在中華人民共和國政府實際控制範圍內(參見:臺灣問題)。中華人民共和國是世界上人口最多的國家,人口總數超過13億,佔全球人口的五分之一。境內民族衆多,獲得官方認可的民族有56個,其中漢族人口占絕大多數,其餘55個民族被統稱爲少數民族。中華人民共和國境內的通用語言是漢語普通話,使用的文字是規範漢字(此即漢語簡化字),少數民族如壯族、維吾爾族、蒙古族、藏族、朝鮮族等擁有自己的文字。《中華人民共和國憲法》規定公民有宗教信仰自由,大部分公民無固定宗教信仰,部分人信仰佛教、道教、基督教和伊斯蘭教等宗教。中華人民共和國共跨越五個時區,但全國皆使用單一的北京時間(東經120度)爲標準時間。

《中華人民共和國憲法》規定中華人民共和國是工人階級領導的、以工農聯盟爲基礎的人民民主專政的社會主義國家;

 

 

搜索出來的:

 

中華人民<font color='red'>共和國</font>(英文:The People's Republic of China,通常簡稱爲中國(英文:China)[5],

 

位於亞洲東部、太平洋西岸,陸上從東北至西南分別與朝鮮

 

只能匹配到一行

 

 使用paoding的話,卻可以匹配到多處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章