使用Solr的ZCatalog多索引
项目描述
介绍
SolrIndex 是一个针对 Plone/Zope 的产品,它通过利用 Solr,Apache Lucene 项目流行的开源企业搜索平台,提供了增强的搜索功能。它与 Plone 4 和 Plone 5 兼容。
默认情况下,SolrIndex 通过替换 Plone 的默认全文索引为基于 Solr 的搜索功能,并包括对某些字段赋予权重的功能,从而提供更相关的搜索结果。
SolrIndex 利用 Solr 的高级搜索算法,提供了令人兴奋的功能,例如使用停用词和同义词的能力。停用词可以控制搜索机制应忽略哪些词,而同义词可以使通过包含额外的匹配项来扩展查询成为可能。
SolrIndex 还提供了闪电般的快速和高度可扩展的搜索功能。SolrIndex 通过设计可扩展,这意味着它具有与其他索引和目录集成的能力。这对于需要为多个存储库提供搜索功能的网站来说是个好消息。
通过额外定制,SolrIndex 还能够提供分面搜索、查询词高亮、拼写建议和“类似内容”建议。
得益于 SolrIndex,现在由 Plone 和 Zope 驱动的网站可以真正享受到企业级搜索功能。
有用链接
特别感谢
Six Feet Up 特别感谢 Shane Hathaway 对 SolrIndex 的关键贡献。
详细文档
安装
将此包包含在您的 Zope 2 或 Plone buildout 中。如果您使用的是 plone.recipe.zope2instance 食谱,请将 alm.solrindex 添加到 eggs 参数和 zcml 参数。请参阅此包中的 buildout.cfg 以获取示例。该示例还展示了如何使用 collective.recipe.solrinstance 食谱以最少额外工作构建一个可工作的 Solr 实例。
一旦安装了此包并启动了 Zope,您就可以访问 ZCatalog 并将 SolrIndex 添加为索引。您应只为 ZCatalog 添加一个 SolrIndex,但单个 SolrIndex 可以取代多个 ZCatalog 索引。
Solr 架构
配置 Solr 架构以存储整数唯一键。添加与您要在 Solr 中索引的对象属性匹配的名称的字段。您应避免创建一个将索引与另一个 ZCatalog 索引在 ZODB 中索引的相同数据的 Solr 字段。换句话说,如果您在 Solr 中添加了 Description 字段,那么您可能应该从 ZCatalog 中删除名为 Description 的索引,以免强制您的系统对描述进行两次索引。
SolrIndex 安装后,您可以查询由 Solr 架构描述的所有字段,即使没有具有匹配名称的 ZCatalog 索引。例如,如果您在 Solr 架构中配置了 Description 字段,那么您可以使用与其他 ZCatalog 索引相同的语法对 Description 字段发出目录查询。例如
results = portal.portal_catalog(Description={'query': 'waldo'})
这种形式的查询会通过一个由字段处理程序对象组成的可配置的转换层。当您需要的灵活性超过字段处理程序提供的功能时,您可以选择编写自己的字段处理程序(请参阅“编写自己的字段处理程序”部分)或提供不进行转换的 Solr 参数(请参阅“透明的 Solr 查询”部分)。
透明的 Solr 查询
您可以通过在 ZCatalog 查询中提供一个 solr_params 字典,通过 SolrIndex 来发出 Solr 查询。例如,如果您在 portal_catalog 中安装了 SolrIndex,则此调用将查询 Solr。
results = portal.portal_catalog(solr_params={'q': 'waldo'})
目录中的 SolrIndex 将将 solr_params 中指定的查询参数发送到 Solr。每个参数值可以是字符串(包括 Unicode)或字符串列表。如果您为其他 Solr 字段提供了查询参数,则传递给 Solr 的参数将与为其他字段生成的参数混合。请注意,Solr 需要为 ‘q’ 参数提供一些值,因此如果您提供了 Solr 参数但没有为 ‘q’ 提供值,SolrIndex 将使用 ‘*:*’ 作为 ‘q’ 的值。
Solr 将返回匹配的文档 ID 和分数列表给 SolrIndex,然后 SolrIndex 将将文档 ID 和分数传递给 ZCatalog,然后 ZCatalog 将将文档 ID 与其他索引的结果相交。最后,ZCatalog 将返回一个排序后的结果对象列表(“大脑”对象)给应用程序代码。
如果您需要访问 Solr 响应对象,请在目录查询中提供一个 solr_callback 函数。在 Solr 发送响应后,SolrIndex 将使用解析后的 Solr 响应对象调用回调函数。响应对象符合 solrpy 包的文档。
高亮显示
可以请求任何在 Solr 模式中标记为 stored 的字段的高亮显示数据。要启用此功能,请传递值为 True 或要高亮显示的字段名列表的 highlight 值。值为 queried 将导致 Solr 为查询的列返回高亮显示数据。如果您传递了一系列字段名,则请求的高亮显示数据将限于该列表。您也可以通过默认方式在 Solr 配置文件中启用它。如果您在配置文件中默认启用,但不想为特定查询启用,您必须在 solr_params 中传递 hl:off。
检索到的数据存储在返回的大脑对象的 highlighting 属性上。要使用自定义的 HighlightingBrain,索引需要能够连接到其父目录。代码尝试检索一个名为此的实用程序,并尝试使用 Acquisition 找到其直接父级的 ID。如果失败,它将默认使用 portal_catalog。如果代码无法自动确定您的目录名称,并且您想使用高亮显示,您需要将 SolrIndex 的 catalog_name 属性更改为正确的值。
要检索高亮显示数据,大脑将有一个 getHighlighting 方法。默认情况下,它设置为返回单个列表中所有字段的突出显示数据。您可以将其限制为特定字段,并通过传递 combine_fields=False 来更改返回格式为以字段名为键的字典。
示例
- results = portal.portal_catalog(SearchableText=’lincoln’,
solr_params={‘highlight’: True})
results[0].getHighlighting() [u’<em>lincoln</em>-collections <em>Lincoln</em> ‘, u’The collection of <em>Lincoln</em> plates’]
results[0].getHighlighting(combine_fields=False) {‘SearchableText’: [u’<em>lincoln</em>-collections <em>Lincoln</em> ‘]} ‘Description’: [u’The collection of <em>Lincoln</em> plates’]}
results[0].getHighlighting(‘Description’) [u’The collection of <em>Lincoln</em> plates’]
results[0].getHighlighting(‘Description’, combine_fields=False) {‘Description’: [u’The collection of <em>Lincoln</em> plates’]}
返回的片段数量、搜索词的突出显示以及其他几个设置都可以在您的Solr配置中进行调整。
编码
提交给Solr进行索引或作为查询的所有数据都必须使用UTF-8编码。为此,SolrIndex有一个名为expected_encodings的行属性,其中详细说明了它尝试从数据中解码并转换为UTF-8的编码列表。如果您提交的数据要被索引或包含不同编码的字符串的查询,您需要将此编码添加到该列表中,在UTF-8之前。
http://wiki.apache.org/solr/FAQ#Why_don.27t_International_Characters_Work.3F
排序
SolrIndex仅提供文档ID和得分,而ZCatalog保留排序结果的责任。要对涉及SolrIndex的查询结果进行排序,就像通常与ZCatalog一起使用一样使用sort_on参数。目前,您不能将SolrIndex用作排序的索引,但将来可能会有所改变。
编写您自己的字段处理器
字段处理器有两个功能。它们解析对象属性进行索引,并将特定字段目录查询转换为Solr查询。它们作为实用工具注册,因此您可以通过ZCML编写自己的处理器并将它们注册。
为了确定Solr字段的字段处理器,alm.solrindex首先查找一个与字段名称匹配的名为ISolrFieldHandler的实用工具。如果没有找到,它将查找一个与在Solr中处理该字段的Java类名称匹配的名为ISolrFieldHandler的实用工具。如果这也失败,它将检索没有名称的ISolrFieldHandler。
请参阅ISolrFieldHandler接口的文档和handlers.py中的示例。
与ZCatalog集成
一个SolrIndex可以取代几个ZCatalog索引。从理论上讲,您可以用一个单一的SolrIndex替换所有的目录索引。但请不要这样做,因为在这个包变得更加成熟之前,它需要承担更多的责任。
此外,替换所有的ZCatalog索引可能不是正确的目标。ZCatalog索引被低估了。ZCatalog索引建立在ZODB提供的出色的支持事务的对象缓存之上。这使它们在相对于网络搜索引擎(如Solr)的性能上具有某些内在优势。与Solr的任何通信都会引起大约毫秒级的延迟,而ZCatalog索引通常可以在几微秒内回答查询。ZCatalog索引还简化了集群设计。ZODB缓存允许集群节点在不依赖于大型中央搜索引擎的情况下执行搜索。
然而,ZCatalog索引目前的不足之处在于索引文本领域。ZCatalog可用的所有文本索引都不及文本搜索引擎(如Solr)的功能和性能。
因此,使用此包的一个好方法是将所有文本索引移到Solr。这样,不需要文本引擎的查询将避免调用Solr的开销。您还可以将其他类型的索引移到Solr。
此包如何维护持久连接
此包使用一种新的方法从ZODB对象维护外部数据库连接。以前的方法包括存储_v_(易失性)属性、在线程局部变量中保持连接以及在ZODB内部重用多数据库支持,但每种方法都有明显的缺点。
新的方法是向ZODB连接对象(任何持久化对象_p_jar属性)中添加一个名为foreign_connections的字典。字典中的每个键是需要保持持久连接的对象的OID。每个值是实现相关的数据库连接或连接包装器。如果可以写入外部数据库,数据库连接或连接包装器应实现IDataManager接口,以便可以将其包含在事务提交或回滚中。
当SolrIndex需要连接到Solr时,它首先在foreign_connections字典中查找是否已建立连接。如果没有建立连接,SolrIndex将立即建立连接。每个ZODB连接都有自己的foreign_connections属性,因此数据库连接不会由并发线程共享,这使得这是一个线程安全的解决方案。
这个解决方案比_v_属性更好,因为连接不会因为普通对象的停用而丢失。这个解决方案比线程局部变量更好,因为它允许对象数据库保持任意数量的外部连接,并且在线程之间传递控制时不会中断。这个解决方案比使用多数据库支持更好,因为多数据库的参与者需要履行一个与ZODB以外的数据库无关的复杂合同。
其他维护外部数据库连接的包应尝试这个方案,看看是否可以提高可靠性和可读性。其他包应使用相同的ZODB连接属性名称,foreign_connections,这不应引起任何冲突,因为OID不能共享。
实现说明:当ZODB对象首次创建时,它们不会存储在任何数据库中,因此对象无法以简单的方式获取foreign_connections字典。在此期间,保持数据库连接的一种方法是暂时回退到易失性属性解决方案。这就是SolrIndex所做的那样(参见_v_temp_cm属性)。
故障排除
如果由于某种原因Solr索引阻止您访问Zope,您可以在环境中设置DISABLE_SOLR=YES,这将导致SolrIndex类绕过Solr对所有查询和更新的处理。
变更日志
1.2.0 (2016-10-15)
在solrpycore中修复了拼写错误。[davidblewett]
感谢:“Schorr,Dr. Thomas” <thomas.schorr@haufe.de>”对以下编码修复,refs票据#1
向SolrIndex添加了一个名为expected_encodings的属性,该属性列出预期的编码,以便在解码发送到Solr的每个参数时逐一尝试。如果所有解码尝试都未能解码文本,我们将回退到UTF8,并替换失败的字符。http://wiki.apache.org/solr/FAQ#Why_don.27t_International_Characters_Work.3F [davidblewett]
向SolrIndex添加了名为_encode_param的方法,用于将给定的字符串编码为UTF8。[davidblewett]
修改了SolrIndex的'_apply_index`,以将所有参数通过'_encode_param`方法发送。[davidblewett]
添加了test__apply_index_with_unicode以确保正确处理Unicode查询。[davidblewett]
初始高亮支持
从Products.CMFCore导入getToolByName,用于导入失败时使用。
更新了SolrIndex,以便将具有stored=True的任何字段从Solr模式传递给高亮显示。
更新了SolrIndex,以便将Solr返回的高亮数据存储在_highlighting属性中。
添加了一个名为HighlightingBrain的类,它从AbstractCatalogBrain继承,用于在SolrIndex中查找高亮数据。
增加了一个测试 test__apply_index_with_highlighting;遗憾的是,当前测试中调用 portal_catalog 不起作用。
[davidblewett]
修复:IIBTree需要整数键 http://plone.org/products/alm.solrindex/issues/3 [thomasdesvenain]
快速修复Plone 4兼容性 [thomasdesvenain]
使用ZCTextIndex的‘*’键字符进行搜索与alm.solrindex兼容。使livesearch与solrindex作为SearchableText索引一起工作。 [thomasdesvenain]
默认情况下不激活高亮显示,因为可能会出现严重的性能问题。在solr_params中传递“highlight”参数以强制启用它,并将“queried”作为“highlight”值以仅强制在查询字段上高亮显示。 [thomasdesvenain]
改进了Unicode处理,以正确处理在 SolrIndex._decode_param 中作为字段搜索传递的字典。 [davidblewett]
扩展了ZCTextIndex在将字典作为字段搜索传递时的支持。 [davidblewett]
更新测试设置,以便针对Solr 1.4进行测试 [claytron]
处理空 dismax 查询,因为对于 q 的 *:* 值不会解释为 dismax 查询处理器,并且返回无结果而不是所有结果。 [claytron]
添加卸载配置文件,恢复默认的Plone索引。 [thet]
为SolrIndex提供meta_type 'SolrIndex'并为其注册ATSimpleStringCriterion,否则集合无法添加SearchableText标准。 [maurits]
确保只发送一个‘q’参数到Solr。 [claytron]
Plone 4.1兼容性。 [timo]
添加缺少的elementtree导入 [saily]
修复了导致不一致结果的过时缓存高亮信息。 [nrb]
Plone 4.3兼容性。 [cguardia]
添加对solr.TrieDateField的支持 [mjpieters]
修复查询请求的解码,以便在发送到字段处理器之前不将列表转换为字符串。 [davisagli]
实现getIndexQueryNames,它是IPluggableIndex的一部分。 [davisagli]
将范围查询支持添加到DateFieldHandler。 [davisagli]
不要将通配符查询转换为模糊查询。 [davisagli]
确认与Plone 5的兼容性 [witekdev, davisagli]
1.1.1 (2010-11-04)
修复指向问题跟踪器和Plone产品页面的链接 [clayton]
1.1 (2010-10-12)
为Plone添加 z3c.autoinclude 支持 [claytron]
1.0 (2010-05-27)
首次公开发布
清理文档,以备发布。 [claytron]
修复reST错误。 [claytron]
0.14 (2010-05-11)
更新SolrConnectionManager以具有模拟的savepoint实现,参考#2451。 [davidb]
0.13 (2010-03-01)
提交以清理版本号
0.12 (2010-03-01)
PEP8清理 [clayton]
0.11 (2009-11-27)
在索引更新中止后,提交不再因断言错误而中断。参考#1340
0.10 (2009-10-15)
从索引文档中过滤出无效的XML字符。
0.9 (2009-10-14)
通过访问login_form登录而不是首页,修复测试失败,因为我们在首页得到模糊错误。 [maurits]
修复了目录对象信息页面。Solr无法解析查询中的负数。
0.8 (2009-09-18)
添加了对Solr布尔字段的支持。
GenericSetup配置文件现在可以选择清除索引。
默认情况下,waituri脚本等待最长90秒,在轮询之间稍作暂停,并接受超时参数。
0.7 (2009-09-13)
现在可以通过环境变量提供Solr URI,因此catalog.xml不需要硬编码URI。
0.6 (2009-09-11)
添加了叙述性文档。
在运行GenericSetup时不要清除索引。清除索引是GenericSetup的一个长期问题;在这种情况下,简单的解决方案是根本不清除。
0.5 (2009-09-10)
添加了一个等待Solr启动的脚本。
引入solrpy的私有副本以修复一些错误
连接重试代码重新连接,但实际上并没有重试请求。
raw_query方法不应假设参数值是unicode(它们可以是unicode列表)。
0.4 (2009-09-10)
在通过GenericSetup导入SolrIndex时清除Solr。
0.3 (2009-09-10)
使字段处理器更灵活。现在它们可以向Solr查询添加任何类型的查询参数。
默认字段处理器现在生成“fq”参数而不是“q”参数。这似乎更符合Solr作者的意图。
将“solr_additional”重命名为“solr_params”。
0.2 (2009-09-09)
添加了一个GenericSetup配置文件,用SolrIndex替换了SearchableText。
将传递额外参数给Solr的目录参数重命名为“solr_additional”。同时将响应回调参数重命名为“solr_callback”。
0.1 (2009-09-09)
第一个版本
项目详情
alm.solrindex-1.2.0.zip的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1a061f11d52ca938d24008003cac04fd5ef30c5cf53651c48267e1ff2fc76fa4 |
|
MD5 | 0b03d21178c40632f6ae187511cecc5e |
|
BLAKE2b-256 | 01e2165b37bd61ef9b9355840d5c66061b83654d725542c5e1e35e6aeb2c57bb |