dnadesign / silverstripe-elemental-textcontentforsearch
一组辅助方法,以简化对元素页面文本内容的索引
Requires
This package is auto-updated.
Last update: 2024-08-29 01:09:16 UTC
README
一组辅助方法,以简化对元素页面的搜索
需求
- Silverstripe CMS ^5
- Silverstripe Elemental ^5
安装
composer require dnadesign/silverstripe-elemental-textcontentforsearch ^1.1
对于 Silverstripe 4,使用 1.0.0 版本
composer require dnadesign/silverstripe-elemental-textcontentforsearch 1.0.0
以下 YAML 配置将启用每个 Page
对象上的元素,替换标准 Content
富文本字段,并添加对 getTextContentForSearch
方法的访问
mysite/_config/elements.yml
Page: extensions: - DNADesign\Elemental\Extensions\ElementalPageExtension - DNADesign\Elemental\Extensions\ElementalPageTextSearchExtension
用法
SolrIndex
我们建议您在索引中使用 TextContentForSearch
而不是 ElementForSearch
方法。这样可以避免渲染整个元素区域,这包括图像和复杂元素,这会消耗大量资源并在索引中找不到。
class ElementalSolrIndex extends SolrIndex { public function init() { $this->addClass(Page::class); $this->addAllFulltextFields(); /** @see ElementalPageTextContentSearchExtension::getTextContentForSearch */ $this->addFulltextField('TextContentForSearch'); } }
配置
默认情况下,该过程将提取元素中的任何 Varchar
、Text
和 HTMLText
字段。如果您需要考虑索引其他类型的字段,可以按以下方式更新配置
Page: db_text_field_types: - CustomFieldType
您可以为每个元素排除字段。默认情况下,Style
和 ExtraClass
字段被排除,因为它们不会对搜索带来任何价值。要排除字段,您可以在类或 YAML 中设置配置
DNADesign\Elemental\Models\ElementContent: exclude_fields_from_search: - Title
或者
class MyCustomElement extends BaseElement { private static $exclude_fields_from_search = [ 'Title' ]; }
相反,您也可以以相同的方式添加字段。
DNADesign\Elemental\Models\ElementContent: include_fields_in_search: - AlternativeText
或者
class MyCustomElement extends BaseElement { private static $include_fields_in_search = [ 'AlternativeText' ]; }
此外,您可以在任何元素或扩展上实现 updateTextFieldsForSearch
方法来更新搜索中包含的字段列表。
某些元素可能具有默认过程未探索的复杂关系。您可以通过实现 addTextContentForSearch
来将额外内容连接到最终字符串。
class MyCustomElement extends BaseElement { private static $has_many = [ 'AccordionItems' => AccordionItem::class ]; public function addTextContentForSearch() { $titles = []; foreach($this->AccordionItems() as $item) { $titles[] = $item->Title; } return implode(' ', $titles); } }
最后,您可以通过实现 updateTextContentForSearch
方法来操纵最终要返回的字符串。
class MyCustomElement extends BaseElement { public function updateTextContentForSearch($string) { // Remove any occurrence of forbiddenWord in the final string return = str_replace('forbiddenWord', '', $string); } }
默认情况下,每个元素都考虑索引。如果您希望从搜索中排除元素,可以按以下方式设置配置
DNADesign\Elemental\Models\ElementContent: exclude_content_from_search: true
或者
class MyCustomElement extends BaseElement { private static $exclude_content_from_search = true; }
调试
由于难以看到被包含在 Solr 索引中的内容,该模块公开了一个由 getTextContentForSearch
方法生成的只读文本字段。您可以通过修改配置来隐藏此字段
DNADesign\Elemental\Extensions\ElementalPageTextSearchExtension: show_text_content_search_in_cms: false
注意
- 内省过程将探索任何
VirtualElement
并提取父元素文本字段
待办事项
- 在保存时添加一个选项将搜索字符串存储在数据库中吗?