toastnz/fulltextsearch

为 SilverStripe CMS 添加对全文搜索引擎(如 Sphinx 和 Solr)的支持

安装: 701

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 83

类型:silverstripe-vendormodule

4.0.0 2022-08-16 23:46 UTC

README

Build Status Scrutinizer Code Quality codecov SilverStripe supported module

为 SilverStripe CMS 添加对全文搜索引擎(如 Sphinx 和 Solr)的支持。兼容 PHP 7.2

升级到全文搜索 3.7.0+ 时的注意事项

与前版本相比,有一些重大变更

草稿内容将不再自动添加到搜索索引中。这种新行为之前是一种可选行为,通过向搜索索引中添加以下行来启用:

$this->excludeVariantState([SearchVariantVersioned::class => Versioned::DRAFT]);

现在默认对所有记录(数据对象)执行对匿名用户(即未登录的用户)的 canView() 检查,以及 ShowInSearch 检查,然后再将其添加到搜索索引中,并且在显示在搜索结果之前。这可能意味着由于这些额外的检查,一些以前被索引并显示在搜索结果中的记录将不再出现。

添加这些额外的检查是为了考虑数据安全,并假定未通过这些检查的记录可能从一开始就不应该被索引。

启用草稿内容的索引

您可以使用以下 yml 配置来索引草稿内容

SilverStripe\FullTextSearch\Search\Services\SearchableService:
  variant_state_draft_excluded: false

但是,当设置为 false 时,它仍然仅在数据对象处于已发布状态时索引草稿内容,而不是仅草稿状态或修改状态。这是因为它仍然会失败新的匿名用户 canView() 检查,并在 SearchableService::isSearchable() 中自动从索引中删除。

如果您希望在数据对象处于仅草稿状态或修改状态时也索引草稿内容,则需要配置 SearchableService::indexing_canview_exclude_classes。有关如何操作的说明见下文。

禁用匿名用户 canView() 预索引检查

如果您不必要,或者它阻碍了预期的功能(例如,对于必须对任何内容进行身份验证才能查看的网站),则可以应用配置以从您的数据对象中移除新的预索引 canView() 检查。这将禁用指定数据对象的子代检查。在禁用预索引检查之前,请确保您的全文搜索实现正确地在查询时间执行 canView() 检查,因为这可能导致私人数据泄露。

SilverStripe\FullTextSearch\Search\Services\SearchableService:
  indexing_canview_exclude_classes:
    - Some\Org\MyDataObject
    # This will disable the check for all pagetypes:
    - SilverStripe\CMS\Model\SiteTree

您还可以使用 SearchableService 上的 updateIsSearchable 扩展点在 ShowInSearchcanView() 检查运行之后修改方法的结果。

强烈建议您在从 3.6 或更早版本升级后,在您的生产网站上运行 solr_reindex,以清除搜索索引中不应存在的任何旧数据。

这些额外的检查可能会由于权限检查的额外查询而影响重新索引性能。如果您的网站还索引文件中的内容,例如 pdf 或 docx 文件,则使用 text-extraction 模块(该模块相当耗时),则 canView() 检查的相对性能影响将不那么明显。

在将内容添加到 Solr 索引之前过滤的详细信息

  • SolrReindexBase 中的 SearchableService::isIndexable() 检查。在 Solr 重新索引期间索引所有记录时使用。
  • SearchableService::isIndexable() 检查在 SearchUpdateProcessor 中。当在 DataObject->write() 期间索引单个记录时使用。

从 solr 索引提取结果时的过滤细节

  • SearchableService::isViewable() 检查在 SolrIndex 中。这通常会在使用 CwpSearchEngine 类的 CWP 实现中以及大多数调用 MySearchIndex->search() 的自定义实现中使用。
  • SearchableService::isViewable() 检查在 SearchForm 中。这将在使用 /SearchForm url 显示搜索结果的 solr 实现中使用。
  • 某些实现可能会两次调用 SearchableService::isViewable()。如果发生这种情况,则第一次调用将缓存在内存中,因此再次调用时几乎没有性能惩罚。
  • 如果您的实现非常自定义且未子类化也未使用 SolrIndexSearchForm,则建议您更新您的实现以调用 SearchableService::isViewable()

需求

  • SilverStripe 4.0+

注意:对于 SilverStripe 3.x,请使用 2.x 版本分支

文档

有关纯 Solr 文档,请参阅 Solr 4.10.4 指南

有关配置和设置的信息,请参阅 文档,或快速版本请参阅 快速入门指南

有关更新、错误修复和功能的信息,请参阅 变更日志

待办事项

  • 移除 includeSubclasses - 实际上未使用,使代码库更难看,并且 ClassHierarchy 可以在查询时用于大多数相同用例

  • 修复查询中的字段引用。应该能够执行 $query->search('Text', 'Content'),而不是像现在这样必须执行的 $query->search('Text', SiteTree::class . '_Content')

    • 确保当字段存在于多个类中时,对裸字段的搜索将搜索所有这些类

    • 允许对特定实例进行搜索

  • 使索引中的字段可以按类限制 - 'SiteTree#Content' 限制字段为特定类,也许 'Content->Summary' 允许调用字段对象的特定方法以获取文本

  • 允许跟踪用户关系(例如,Children.Foo)

  • 更清楚地说明状态对象关系(例如,Parent.Foo,其中 Parent 是版本化的)会发生什么

  • 对 SearchUpdater 进行改进

    • 使其在对象(A 在 A.B.Foo 之间)更新时正常工作

    • 允许用户逻辑在字段是用户生成时触发文档重新索引

  • 添加拼写纠正、文件文本提取和片段生成的通用 API