dnadesign/silverstripe-elemental-textcontentforsearch

一组辅助方法,以简化对元素页面文本内容的索引

1.1.0 2023-08-28 23:08 UTC

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');
    }
}

配置

默认情况下,该过程将提取元素中的任何 VarcharTextHTMLText 字段。如果您需要考虑索引其他类型的字段,可以按以下方式更新配置

Page:
  db_text_field_types:
    - CustomFieldType

您可以为每个元素排除字段。默认情况下,StyleExtraClass 字段被排除,因为它们不会对搜索带来任何价值。要排除字段,您可以在类或 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 并提取父元素文本字段

待办事项

  • 在保存时添加一个选项将搜索字符串存储在数据库中吗?