特征

警告

在调用任何需要Java VM的PyLucene API之前,请通过以下方式启动它打电话initVM(类路径,…)。有关此函数的详细信息,请参见在这里.

安装PyLucene

PyLucene是用JCC公司.

要构建PyLucene,首先需要构建JCC。JCC的来源包括包含在PyLucene源中。建筑说明和正在安装JCC在这里.

建造PyLucene的说明如下在这里.

API文档

PyLucene正在密切关注JavaLucene™版本。它打算支持整个Lucene API。

PyLucene还包括许多Lucene contrib软件包:Snowball分析器词干分析器、高亮软件包、英语以外其他语言的分析器,正则表达式查询、特殊查询,如“more like this”等。

本文档仅介绍了Lucene提供的pythonic扩展以及Java和Python之间的一些区别API。有关Java Lucene API的文档,看见在这里.

为了帮助调试并支持一些Lucene API,PyLucene还公开一些Java运行时API。

样品

学习PyLucene的最好方法是查看包含在PyLucene源代码版本或在以下网站上发布:

带attachCurrentThread的线程支持

在可以从主线程以外的线程使用PyLucene API之前不是由Java Runtime创建的附加当前线程()方法必须是调用了JCCEnv公司对象返回的初始化VM()获取VMEnv()功能。

lucene的异常处理。Java错误

Java异常在语言障碍处被捕获,并通过引发其args元组包含实际Java Exception实例的JavaError实例。

处理Java阵列

Java数组在杰瑞包装器实例实现Python序列协议。可以更改数组元素但不改变数组大小。

一些Lucene API接受数组参数并期望在其中返回值。要调用这样的API并能够在调用后检索数组值Java数组需要先实例化。
例如,访问termDocs:

termDocs=reader.termDocs(术语(“isbn”,isbn))<br/>
docs=JArray('in')(1)#分配一个int[1]数组<br/>
freq=JArray('int')(1)#分配一个int[1]数组
如果termDocs.read(docs,freq)==1:<br/>
&nbsp&nbsp;bits.set(docs[0])#访问数组的第一个元素

除了整数,的杰瑞函数接受对象,一串,布尔,字节,烧焦,双重的,浮动,长的短的创建数组相应类型的。这个JArray(“对象”)构造函数需要一秒钟表示对象元素类的参数。此参数是可选的,并且默认为Object。

要将字符数组转换为Python字符串,请使用“”.join(数组)构造。

不是一个表示所需Java数组大小的整数,而是一个可以将预期元素类型的对象传递给数组构造函数。
例如:

\#从[1.5,2.5]列表创建双精度Java数组
JArray(“双倍”)([1.5,2.5])<br/>

所有需要数组的方法也接受应为元素类型。如果在因此,不需要实例化Java数组来进行此类调用。

请参见JCC公司有关处理数组的更多信息。

Java Lucene和PyLucene API之间的差异

  • PyLucene API在PyLucene模块。例如,Java import语句导入org.apache.lucene.index。IndexReader;对应于Python导入陈述从lucene导入IndexReader

  • 降级是Java中的常见操作,但不是Python中的概念。因为包装器对象正好实现声明类型的API包装对象时,所有类都实现了两个名为instance和cast分别验证和转换实例。

Java Lucene API的物理扩展

Java是一种非常冗长的语言。另一方面,Python提供了许多用于迭代、属性访问等的语法上有吸引力的构造…As来自行动中的Lucene这本书被移植到了Python,PyLucene收到了以下列出的许多pythonic扩展:

  • 迭代搜索命中率是一种非常常见的操作。点击实例是可迭代的在Python中。每次迭代都返回两个值Hits实例中的文档和文档实例本身。
    Java循环:
for(int i=0;i&lt;hits.length();i++){<br/>
&nbsp&nbsp;文档文档=hits.doc(i)<br/>
&nbsp&nbsp;System.out.println(hits.score(i)+“:”+doc.get(“title”))<br/>
}<br/>

可以用Python编写:

点击率:<br/>
&nbsp&nbsp;hit=命中.cast_(命中)<br/>
&nbsp&nbsp;打印hit.getScore(),':',hit.getDocument['title']<br/>

如果hit.iterator()的next()方法被声明为返回点击而不是对象,上述cast_()调用是不必要的。
相同的java循环也可以写入:

对于  润智(伦恩(击打)):<br个/>
&nbsp(网络广播);&nbsp(网络广播);打印 击打.分数(), ':', 击打[]['标题']<br个/>
  • Hits实例部分实现了Python“sequence”协议。
    Java表达式:
hits.length()<br/>
doc=点击数.get(i)<br/>

最好用Python编写:

伦恩(击打)<br个/>
文件 = 击打[]<br个/>
  • 文档实例具有可以通过映射访问其值的字段协议。
    Java表达式:
doc.get(“标题”)

最好用Python编写:

文档[标题]
  • 可以迭代文档实例的字段。
    Java循环:
枚举字段=doc.getFields()<br/>
while(fields.hasMoreElements()){<br/>
&nbsp&nbsp;Field Field=(Field)fields.nextElement()<br/>
&nbsp&nbsp<br/>
}<br/>

最好用Python编写:

对于doc.getFields()中的字段:<br/>
&nbsp&nbsp;field=field.cast_(field)<br/>
&nbsp&nbsp<br/>

一旦JCC注意到Java 1.5类型的参数,并且一旦Java Lucene利用了它们,这样的铸造应该是不必要的

从Python扩展Java Lucene类

Lucene API的许多领域都希望程序员提供自己的实现或者对默认值不合适的功能进行专门化。例如,文本分析器和标记器是一个包含许多参数和环境或者文化因素要求定制。

PyLucene通过提供下面列出的Java扩展点来实现这一点的代理,以便Java调用这些自定义的Python实现。

这些扩展点是JCC生成本机C的简单Java类++的实现。很容易将更多这样的扩展类添加到PyLucene源代码树的“java”目录。

要了解有关此主题的更多信息,请参阅JCC文档.

请参考“java”树中的类以获取当前可用的扩展点。PyLucene的单元测试。