麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

使用lucene 3.0.0 索引和檢索中文文件

2019-11-17 03:52:06
字體:
供稿:網(wǎng)友
一. 我本來的程序

    其實(shí)我本來的程序挺簡單, 完全修改自Demo里面的SearchFiles和IndexFiles. 唯一不同的是引用了SmartCN的分詞器.

    我把修改那一點(diǎn)的代碼貼出來.

    IndexhChinese.java:

Date start = new Date();try {  IndexWriter writer = new IndexWriter(FSDirectory.open(INDEX_DIR),           new SmartChineseAnalyzer(Version.LUCENE_CURRENT), true, IndexWriter.MaxFieldLength.LIMITED);  indexDocs(writer, docDir);  System.out.PRintln("Indexing to directory '" +INDEX_DIR+ "'...");  System.out.println("Optimizing...");  //writer.optimize();  writer.close();   Date end = new Date();  System.out.println(end.getTime() - start.getTime() + " total milliseconds"); }
    SearchChinese.java

Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_CURRENT); BufferedReader in = null;if (queries != null) {  in = new BufferedReader(new FileReader(queries));} else {  in = new BufferedReader(new InputStreamReader(System.in, "GBK"));}
     在這里, 我制定了輸入的查詢是采用GBK編碼的.

     然后我充滿信心的運(yùn)行后......發(fā)現(xiàn)無法檢索出中文, 里面的英文檢索是正常的.



二. 發(fā)現(xiàn)問題.

     于是我就郁悶了, 由于對于java與lucene都是太熟悉, 而且用的3.0.0版外面的討論又不是太多, 就瞎折騰了一會兒, 發(fā)現(xiàn)我如果把文件的格式另存為ansi就可以檢索中文了(以前是utf-8的), 看來是文件編碼的問題, 摸索了一下, 在indexChinese.java中發(fā)現(xiàn)了如下的代碼:

static void indexDocs(IndexWriter writer, File file)  throws IOException {  // do not try to index files that cannot be read  if (file.canRead()) {    if (file.isDirectory()) {      String[] files = file.list();      // an IO error could occur      if (files != null) {        for (int i = 0; i < files.length; i++) {          indexDocs(writer, new File(file, files[i]));        }      }    } else {      System.out.println("adding " + file);      try {        writer.addDocument(FileDocument.Document(file));      }      // at least on windows, some temporary files raise this exception with an "access denied" message      // checking if the file can be read doesn't help      catch (FileNotFoundException fnfe) {        ;      }    }  }
     重點(diǎn)在于這一句:

try {  writer.addDocument(FileDocument.Document(file));}
    讀取文件的代碼應(yīng)該就在這里面, 跟蹤進(jìn)去:

public static Document Document(File f)     throws java.io.FileNotFoundException, UnsupportedEncodingException {  Document doc = new Document();   doc.add(new Field("path", f.getPath(), Field.Store.YES, Field.Index.NOT_ANALYZED));   doc.add(new Field("modified",      DateTools.timeToString(f.lastModified(), DateTools.Resolution.MINUTE),      Field.Store.YES, Field.Index.NOT_ANALYZED));    doc.add(new Field("contents", FileReader(f)));   // return the document  return doc;} private FileDocument() {}}

     這是Lucene的一個內(nèi)部類, 作用就是從一個文本文件中獲取內(nèi)容, 生成的Document默認(rèn)有3個域: path, modified, content, 而content就是文件的文本內(nèi)容了. 看來是FileReader(f), 這個函數(shù)出了問題了, 根本沒有制定采用什么編碼進(jìn)行讀取啊, 于是把這兒簡單的修改了一下.

FileInputStream fis=new FileInputStream(f);//   按照 UTF-8 編碼方式將字節(jié)流轉(zhuǎn)化為字符流InputStreamReader isr=new InputStreamReader(fis,"UNICODE");//   從字符流中獲取文本并進(jìn)行緩沖BufferedReader br=new BufferedReader(isr); doc.add(new Field("contents", br));
     至于那個"Unicode"可以修改為支持的所有編碼, 當(dāng)我修改為"utf-8"后就可以正常使用了.


三. 一些猜測:

     對于Lucene索引文件的時(shí)候, 編碼是沒有關(guān)系的, 只要正確指定了, 那么輸出的文件都是可以被正常檢索到的, 也就是說, 不同的編碼文件索引后的結(jié)果一樣(求證)


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中文字幕网址 | 国产精品成人一区二区三区电影毛片 | 欧美一级做a | 在线观看中文字幕av | 青草久久久久 | 亚洲视屏在线 | 日韩av影片在线观看 | av在线直播观看 | 黄色片网站免费观看 | 久久综合狠狠综合久久 | xnxx 日本免费| av黄色在线免费观看 | 欧美成年私人网站 | 人人看人人艹 | 国产成人高清在线观看 | 黄色网址免费入口 | 国产精品亚洲一区二区三区在线观看 | 性高潮一级片 | 操嫩草| 免费a级黄色片 | 精品一区二区三区在线观看视频 | 成人午夜影院 | 色综合久久久久久 | 黄色网电影| 怦然心动50免费完整版 | 操操插插 | 日本高清黄色片 | 九九热九九热 | 99热99精品 | 毛片av网址 | bt 自拍 另类 综合 欧美 | 久久精品re | 欧美一级电影网站 | 狠狠干五月天 | 欧美3p激情一区二区三区猛视频 | 369看片你懂的小视频在线观看 | 亚洲日本欧美 | 久久久资源网 | 久久久久久久一区二区三区 | 日韩精品中文字幕在线播放 | 日韩av片在线播放 |