Silverstripe solr 搜索文件、页面和数据对象
Silverstripe solr search files, pages, and dataobjects
如何正确地将文件添加到搜索索引...
使用自定义索引,我可以成功搜索页面和数据对象,但是一旦我尝试将文件包含在此索引中,页面就会从结果集中消失,我只能得到文件和数据对象 returned .
这将按预期 return 页面和数据对象。
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();
}
Returns 仅文件和数据对象。我认为 $this->addAllFulltextFields();
现在只应用于文件吗?
关于在 Solr 索引中同时包含页面和文件,我遇到了类似(但略有不同)的问题,但我弄清楚发生了什么的方式可能会有所帮助。
问题是我们希望文件有一个抽象文本字段,用户可以在其中输入文件的简短描述,但是通用 Web 平台 (CWP) 页面上有一个抽象字段,因此 Solr 索引了它而不是文件上的抽象字段。
对于您遇到的问题,您是否尝试登录到 Solr 服务器并浏览架构以查看 Solr 实际包含在索引中的字段?
如果 运行 本地 Solr(使用 silverstripe/fulltextsearch-localsolr 模块)你应该可以在这里访问服务器 http://localhost:8983/solr
进入 Solr 服务器 Web 界面后,尝试执行以下操作...
- 从左侧菜单的下拉菜单中选择索引
- 单击底部的模式浏览器
- 在右窗格中,单击顶部的 'Please select..' 下拉菜单并检查索引中的字段是否符合预期。
如果幸运的话,您可能会看到 Solr 选择了错误地索引某些内容(可能比较索引中有文件和没有文件的索引字段),这将为您提供解决此问题的线索。
关于这一点,我认为最好不要使用 $this->addAllFulltextFields();因为这会将所有内容都放入索引中。我会指定哪些字段是必需的。对于页面,通常只有标题、摘要、内容才是真正需要的。
另外给你一个提示;我发现如果将文件的 IncludeSubclasses 设置为 true,搜索结果将包括资产目录中的文件夹以及图像。在我们的例子中,我们只需要文档,因此将 IncludeSublcasses 设置为 false 以排除文件图像和文件夹。
如果你碰巧做了或确实解决了这个问题,如果你能post原因和解决方案是什么,那就太好了。
干杯,
豆哥.
如何正确地将文件添加到搜索索引...
使用自定义索引,我可以成功搜索页面和数据对象,但是一旦我尝试将文件包含在此索引中,页面就会从结果集中消失,我只能得到文件和数据对象 returned .
这将按预期 return 页面和数据对象。
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();
}
Returns 仅文件和数据对象。我认为 $this->addAllFulltextFields();
现在只应用于文件吗?
关于在 Solr 索引中同时包含页面和文件,我遇到了类似(但略有不同)的问题,但我弄清楚发生了什么的方式可能会有所帮助。
问题是我们希望文件有一个抽象文本字段,用户可以在其中输入文件的简短描述,但是通用 Web 平台 (CWP) 页面上有一个抽象字段,因此 Solr 索引了它而不是文件上的抽象字段。
对于您遇到的问题,您是否尝试登录到 Solr 服务器并浏览架构以查看 Solr 实际包含在索引中的字段?
如果 运行 本地 Solr(使用 silverstripe/fulltextsearch-localsolr 模块)你应该可以在这里访问服务器 http://localhost:8983/solr
进入 Solr 服务器 Web 界面后,尝试执行以下操作...
- 从左侧菜单的下拉菜单中选择索引
- 单击底部的模式浏览器
- 在右窗格中,单击顶部的 'Please select..' 下拉菜单并检查索引中的字段是否符合预期。
如果幸运的话,您可能会看到 Solr 选择了错误地索引某些内容(可能比较索引中有文件和没有文件的索引字段),这将为您提供解决此问题的线索。
关于这一点,我认为最好不要使用 $this->addAllFulltextFields();因为这会将所有内容都放入索引中。我会指定哪些字段是必需的。对于页面,通常只有标题、摘要、内容才是真正需要的。
另外给你一个提示;我发现如果将文件的 IncludeSubclasses 设置为 true,搜索结果将包括资产目录中的文件夹以及图像。在我们的例子中,我们只需要文档,因此将 IncludeSublcasses 设置为 false 以排除文件图像和文件夹。
如果你碰巧做了或确实解决了这个问题,如果你能post原因和解决方案是什么,那就太好了。
干杯, 豆哥.