如何正确地将文件添加到搜索索引......
使用自定义索引我可以成功搜索页面和数据对象,但是一旦我尝试在此索引中包含文件,页面就从结果集中删除,我只返回文件和数据对象。
这将按预期返回页面和数据对象。
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();
现在只适用于文件?
答案 0 :(得分:0)
在Solr索引中包含页面和文件时,我遇到了类似(但略有不同)的问题,但我弄清楚发生了什么可能会有所帮助。
问题在于我们希望文件具有抽象文本字段,用户可以在其中输入文件的简短描述,但是常见的Web平台(CWP)页面上有一个抽象字段,因此Solr将索引编入索引而不是文件上的抽象字段。
对于您所面临的问题,您是否尝试登录Solr服务器并浏览架构以查看Solr在索引中实际包含哪些字段?
如果在本地运行Solr(使用silverstripe / fulltextsearch-localsolr模块),您应该可以在此处访问服务器http://localhost:8983/solr
进入Solr服务器Web界面后,请尝试执行以下操作...
如果幸运的话,你可能会看到Solr选择错误地索引某些东西(可能比较索引中有和没有文件的索引字段),这将为你提供如何解决这个问题的线索。
就此而言,我认为最好不要使用$ this-> addAllFulltextFields();因为那把一切都扔进了索引。我会指定哪些字段是必需的。在页面的情况下,通常标题,摘要,内容都是真正需要的。
另一个提示给你;我发现如果文件的IncludeSubclasses设置为true,搜索结果将包含assets目录中的文件夹以及图像。在我们的例子中,我们只需要文档,因此对于排除图像和文件夹的文件,将IncludeSublcasses设置为false。
如果你偶然做过或者确实解决了这个问题,那么你可以发布原因和解决方案是很好的。
干杯, 道格。