lucene python_Python+Lucene

pylucene让Python可以调用Lucene API实现搜索,这个项目紧跟Lucene的步调,对用惯了Python的同学来说是个福音。

pylucene是通过JCC实现的,JCC读取 jar 包里的public class/method签名,生成C++的包装类,通过JNI(Java Native Interface)调用java的class/mathod。C++代码转成Python的扩展模块,在Python虚拟机里嵌入JVM就可以用了。细节参考http://lucene.apache.org/pylucene/jcc/documentation/readme.html 。

由于Paoding跟Lucene 2.9版本以前的接口是一致的,因此找了一个最接近的PyLucene版本(pylucene 2.4),但里面的JCC比较老了,因此使用了pylucene 3.3的JCC。

下文假定 python 2.7.2安装到 /data/python-2.7.2 目录,相关源码保存在 /data/src 目录。

1 安装 Python

下载Python 2.7.2

切换到解压目录

./configure --prefix=/data/python-2.7.2 --enable-shared

make && make install

export LD_LIBRARY_PATH=/data/python-2.7.2/lib

安装包 setuptools

wget

http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e

tar zxvf setuptools-0.6c11.tar.gz

cd setuptools-0.6c11

/data/python-2.7.2/bin/python setup.py install

2 安装 JCC 2.10

下载 pylucene-3.3-3-src.tar.gz

切换到解压目录

cd jcc

给 setuptools打补丁

mkdir tmp

cd tmp

unzip -q /data/python-2.7.2/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg

patch -Nup0 < /data/src/pylucene-3.3-3/jcc/jcc/patches/patch.43.0.6c11

sudo zip

/data/python-2.7.2/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg -f

cd ..

rm -rf tmp

ln -sf /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64 /usr/lib/jvm/java-6-openjdk

/data/python-2.7.2/bin/python setup.py build

/data/python-2.7.2/bin/python setup.py install

3 安装 PyLucene + Paoding

下载 pylucene-2.4.1-2-src.tar.gz 和 paoding-analysis-2.0.4-beta.zip

tar zxvf pylucene-2.4.1-2-src.tar.gz

mkdir paoding

cd paoding

unzip ../paoding-analysis-2.0.4-beta.zip

切换到 pylucene-2.4.1-2解压目录

vi Makefile 修改内容如下

...

# Linux (Ubuntu 8.10 64-bit, Python 2.5.2, OpenJDK 1.6, setuptools 0.6c9)

PREFIX_PYTHON=/data/python-2.7.2

ANT=ant

PYTHON=$(PREFIX_PYTHON)/bin/python

JCC=$(PYTHON) -m jcc --shared

NUM_FILES=2

...

JARS=$(LUCENE_JAR) $(SNOWBALL_JAR) $(HIGHLIGHTER_JAR) $(ANALYZERS_JAR) \

$(REGEX_JAR) $(QUERIES_JAR) $(INSTANTIATED_JAR) $(EXTENSIONS_JAR) \

/data/src/paoding/paoding-analysis.jar

...

GENERATE=$(JCC) $(foreach jar,$(JARS),--jar $(jar)) \

--include /data/src/paoding/lib/commons-logging.jar \

--package java.lang java.lang.System \

...

运行

make

make install

4 测试

export LD_LIBRARY_PATH=/data/python-2.7.2/lib

export PAODING_DIC_HOME=/data/src/paoding/dic

/data/python-2.7.2/bin/python /data/src/testpylucene.py

testpylucene.py的内容如下:

# -*_ coding: utf-8 -*-

#

from lucene import *

texts = ["Python是一个很有吸引力的语言",

"C++语言也很有吸引力,长久不衰",

"我们希望Python和C++高手加入",

"我们的技术巨牛,人人都是高手"]

def search(searcher, qtext):

tq = TermQuery(Term("content", qtext))

hits = searcher.search(tq)

print "----------------------------------------------"

print "Query:'%s', %d Found" % (qtext,hits.length())

for i in range(hits.length()):

doc = hits.doc(i)

print "\t",doc.get("content")

def dump(reader):

for i in range(reader.maxDoc()):

print "-----------------------------------------------"

tv = reader.getTermFreqVector(i, "content")

for tk in tv.getTerms():

print tk

initVM()

directory = RAMDirectory()

analyzer = PaodingAnalyzer()

writer = IndexWriter(directory, analyzer, True)

for text in texts:

doc = Document()

doc.add(Field("content", text, Field.Store.YES, Field.Index.TOKENIZED,

Field.TermVector.YES))

writer.addDocument(doc)

writer.optimize()

writer.close()

reader = IndexReader.open(directory)

dump(reader)

searcher = IndexSearcher(directory)

search(searcher, "python")

search(searcher, "C++")

search(searcher, "高手")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值