1

如何正确地将文件添加到搜索索引...

使用自定义索引,我可以成功搜索页面和数据对象,但是一旦我尝试在此索引中包含文件,页面就会从结果集中消失,我只会返回文件和数据对象。

这将按预期返回页面和数据对象。

class EntrySearchIndex extends SolrSearchIndex
{
    public function init()
    {
        $this->addClass('SiteTree');
        $this->addClass('EntryAccordionItem');
        $this->addClass('EntryInformationBoxItem');
        $this->addClass('EntryTabItem');

        $this->addAllFulltextFields();
        $this->addFilterField('ShowInSearch');

        $this->excludeVariantState(array('SearchVariantVersioned' => 'Stage'));
    }
}

和一个基本的工作搜索功能

public static function keywordSearch($keywords)
{
    $keywords = Convert::raw2sql(trim($keywords));

    $classes[] = array('class' => 'EntryPage', 'includeSubclasses' => true);
    $classes[] = array('class' => 'EntryAccordionItem');
    $classes[] = array('class' => 'EntryInformationBoxItem');
    $classes[] = array('class' => 'EntryTabItem');

    $index = singleton('EntrySearchIndex');
    $engine = SearchQuery::create();

    return $engine->search($keywords, $classes, $index, -1, 0)->getResults();
}

进行以下小修改以允许文件(为简洁起见仅显示更改)

public function init()
{
    $this->addClass('SiteTree');
    $this->addClass('EntryAccordionItem');
    $this->addClass('EntryInformationBoxItem');
    $this->addClass('EntryTabItem');

    // File specific
    $this->addClass('File');
    $this->addFulltextField('FileContent');

    $this->addAllFulltextFields();
    $this->addFilterField('ShowInSearch');
    $this->excludeVariantState(array('SearchVariantVersioned' => 'Stage'));
}


public static function keywordSearch($keywords)
{
    [...]

    // File specific
    $classes[] = array('class' => 'File', 'includeSubclasses' => true);

    [...]

    return $engine->search($keywords, $classes, $index, -1, 0)->getResults();
}

仅返回文件和数据对象。我的想法$this->addAllFulltextFields();是否正确现在只应用于文件?

4

1 回答 1

1

我在 Solr 索引中同时包含页面和文件时遇到了类似(但略有不同)的问题,但我弄清楚发生了什么的方式可能会有所帮助。

问题是我们希望文件有一个抽象文本字段,用户可以在其中输入文件的简短描述,但通用 Web 平台 (CWP) 页面上有一个抽象字段,因此 Solr 索引了该字段而不是抽象字段在文件上。

对于您面临的问题,您是否尝试过登录到 Solr 服务器并浏览架构以查看 Solr 实际包含在索引中的字段?

如果在本地运行 Solr(使用 silverstripe/fulltextsearch-localsolr 模块),您应该能够在此处访问服务器http://localhost:8983/solr

进入 Solr 服务器 Web 界面后,尝试执行以下操作...

  • 从左侧菜单的下拉列表中选择您的索引
  • 单击底部的模式浏览器
  • 在右窗格中,单击顶部的“请选择..”下拉菜单,然后检查索引中的字段是否符合预期。

如果幸运的话,您可能会看到 Solr 选择不正确地索引某些内容(可能比较索引中是否包含文件的索引字段),这将为您提供有关如何解决此问题的线索。

在那张纸条上,我认为最好不要使用 $this->addAllFulltextFields(); 因为这会将所有内容都放入索引中。我会指定哪些字段是必需的。在页面的情况下,通常标题、摘要、内容都是真正需要的。

还有另一个提示;我发现如果文件的 IncludeSubclasses 设置为 true,则搜索结果将包括资产目录中的文件夹以及图像。在我们的例子中,我们只想要文档,因此对于排除图像和文件夹的文件,将 IncludeSublcasses 设置为 false。

如果您碰巧解决了这个问题,那么如果您可以发布原因和解决方案,那就太好了。

干杯,道格。

于 2016-04-27T21:44:56.893 回答