silverstripe/fulltextsearch

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

安装量: 281,667

依赖项: 14

建议者: 4

安全: 0

星星: 43

关注者: 15

分支: 83

开放问题: 11

类型:silverstripe-vendormodule

4.0.5 2024-03-19 23:06 UTC

README

CI

为Silverstripe CMS添加对Sphinx和Solr等全文搜索引擎的支持。兼容PHP 7.2

升级到fulltextsearch 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()检查。这将禁用指定数据对象的子代检查。确保您的fulltextsearch实现正确地在查询时间执行了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索引之前进行过滤的详细信息

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

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

  • SearchableService::isViewable() 检查在 SolrIndex 中。这通常用于使用 CwpSearchEngine 类的 CWP 实现以及大多数调用 MySearchIndex->search() 的自定义实现。
  • SearchableService::isViewable() 检查在 SearchForm 中。这将在使用 /SearchForm url 显示搜索结果时使用。
  • 某些实现将两次调用 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