PyLucene实战

jopen 12年前

PyLuceneJavaLucenePython版封装。这个工具的目标是让Python使用Lucene的文本索引和搜索能力。它与JavaLucene的最新版本是兼容的。PyLucene把一个带有JAVA VMLucene嵌入到Python进程中。你可以在http://lucene.apache.org/pylucene/网站上找到更多的PyLucene详情。

本文中,我们将描述如何使用PyLucene构建搜索索引和查询一个搜索索引。你可以从先前的文档看到Lucene3.0安装说明

PyLucene-Win32下的安装包可以从下面的网址中找到:

http://code.google.com/a/apache-extras.org/p/pylucene-extra/downloads/list

注:使用PyLucene必须安装Java SDK

1.  使用PyLucene创建索引

使用下面的代码基于PyLucene来创建索引

#!/usr/bin/env python     import os,sys,glob     import lucene     fromlucene import SimpleFSDirectory, System, File, Document, Field, \     StandardAnalyzer, IndexWriter, Version     """     Example of Indexing with PyLucene 3.0     """    def luceneIndexer(docdir,indir):             """             IndexDocuments from a directory             """             lucene.initVM()             DIRTOINDEX= docdir             INDEXIDR= indir             indexdir= SimpleFSDirectory(File(INDEXIDR))             analyzer= StandardAnalyzer(Version.LUCENE_30)             index_writer= IndexWriter(indexdir,analyzer,True,\             IndexWriter.MaxFieldLength(512))             fortfile in glob.glob(os.path.join(DIRTOINDEX,'*.txt')):                       print"Indexing: ", tfile                       document= Document()                       content= open(tfile,'r').read()                       document.add(Field("text",content,Field.Store.YES,\                                Field.Index.ANALYZED))                       index_writer.addDocument(document)                       print"Done: ", tfile             index_writer.optimize()             printindex_writer.numDocs()             index_writer.close()

你必须提供两个参数给luceneIndexer()函数。

1)  一个保存被索引文档的目录路径;

2)  一个索引存储的目录路径。

2.  使用Pylucene查询

下面的代码用于查询Pylucene创建的索引。

#!/usr/bin/env python     import sys     import lucene     fromlucene import SimpleFSDirectory, System, File, Document, Field,\     StandardAnalyzer, IndexSearcher, Version,QueryParser     """     PyLucene retriver simple example     """     INDEXDIR = "./MyIndex"    def luceneRetriver(query):             lucene.initVM()             indir= SimpleFSDirectory(File(INDEXDIR))             lucene_analyzer= StandardAnalyzer(Version.LUCENE_30)             lucene_searcher= IndexSearcher(indir)             my_query= QueryParser(Version.LUCENE_30,"text",\             lucene_analyzer).parse(query)             MAX= 1000    total_hits =lucene_searcher.search(my_query,MAX)             print"Hits: ",total_hits.totalHits             forhit in total_hits.scoreDocs:                       print"Hit Score: ",hit.score, "Hit Doc:",hit.doc, "HitString:",hit.toString()                       doc= lucene_searcher.doc(hit.doc)                       printdoc.get("text").encode("utf-8")     luceneRetriver("really coolrestaurant")

在代码中,我们认为的指定索引目录为INDEXDIR=./MyIndex,你也可以使用命令行参数(sys.argv)来接收索引目录来替换它。

当使用函数luceneRetriver()时,你必须给一个查询作为参数。

转自:http://blog.csdn.net/fan_hai_ping/article/details/7966461