PyLucene學習筆記 文件索引及檢索


一、使用Indexer建立文本文件索引

      這裏簡化爲對某一目錄下面的所有後綴爲“.py”的文件建立索引。

'''
Created on 2011-11-16

@author: killua
@E-mail:[email protected]
'''
import os

from time import time
from datetime import timedelta
from lucene import \
    IndexWriter, StandardAnalyzer, Document, Field, \
    InputStreamReader, FileInputStream, Version, SimpleFSDirectory, File, \
    initVM, CLASSPATH
    
class Indexer(object):
    _indexDir = ""
    _dataDir = ""
        
    def __init__(self, indexDir, dataDir):
        self._indexDir = indexDir
        self._dataDir = dataDir
        
    def index(self):
        if not (os.path.exists(self._dataDir) and os.path.isdir(self._dataDir)):
            raise IOError, "%s isn't existed or is not a directory" % (self._dataDir)
        
        dir = SimpleFSDirectory(File(self._indexDir))
        writer = IndexWriter(dir, StandardAnalyzer(Version.LUCENE_CURRENT),
                             True, IndexWriter.MaxFieldLength.LIMITED)
        writer.setUseCompoundFile(False);
        self.indexDirectory(writer, self._dataDir)
        numIndexed = writer.numDocs();
        writer.optimize()
        writer.close()
        dir.close()
        
        return numIndexed
    
    def indexDirectory(self, writer, dir):
        
        for name in os.listdir(dir):
            path = os.path.join(dir, name)
            if os.path.isfile(path):
                if path.endswith('.py'):
                    self.indexFile(writer, path)
            elif os.path.isdir(path):
                self.indexDirectory(writer, path)
             
    def indexFile(self, writer, path):
        try:
            reader = InputStreamReader(FileInputStream(path), 'UTF-8')
        except IOError, e:
            print 'IOError while opening %s: %s' %(path, e)
        else:
            print 'Indexing', path
            doc = Document()
            doc.add(Field("contents", reader))
            doc.add(Field("path", os.path.abspath(path),
                          Field.Store.YES, Field.Index.NOT_ANALYZED))
            writer.addDocument(doc)
            reader.close()

def main():
    initVM(CLASSPATH)
    indexDir = "./index/"
    dataDir = "/home/killua/Workspace/"
    indexer = Indexer(indexDir, dataDir)
    
    start = time()
    numIndexed = indexer.index()
    duration = timedelta(seconds=time() - start)
    print "Indexing %s files took %s" %(numIndexed, duration)
    
if __name__ == "__main__":
    main()
                    
        
    
    

運行結果:

Indexer.py 將在index目錄下建立一些索引文件,用於對.py文件建立索引


二、使用Searcher檢索文件

下面程序中實現了對文件的檢索,其中參數q是一個表達式,可以理解爲檢索使用的關鍵字,如果文件中包含次關鍵字將被檢索出來

'''
Created on 2011-11-17

@author: killua
@E-mail:[email protected]
'''

import os

from time import time
from datetime import timedelta

from lucene import \
     Document, IndexSearcher, FSDirectory, QueryParser, StandardAnalyzer, \
     SimpleFSDirectory, File, Version, initVM, CLASSPATH
     
class Searcher(object):
    
    def search(self, indexDir, q):
        fsDir = SimpleFSDirectory(File(indexDir))
        searcher = IndexSearcher(fsDir, True)
        query = QueryParser(Version.LUCENE_CURRENT, "contents",
                            StandardAnalyzer(Version.LUCENE_CURRENT)).parse(q)
        starttime = time()
        hits = searcher.search(query, 50).scoreDocs
        duration = timedelta(seconds=time() - starttime)
        
        print "Found %d document(s) (in%s) that matched query '%s':" %(len(hits), duration, q)
        
        for hit in hits:
            doc = searcher.doc(hit.doc)
            print 'path:', doc.get("path")
 
def main():
    initVM(CLASSPATH)
    indexDir = "./index/"
    q = "Killua"
    searcher = Searcher()
    searcher.search(indexDir, q)
    
if __name__ == "__main__":
    main()
                 
            

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