C#学习教程:有选择地从Sitecore的Lucene搜索索引中排除项目——在使用IndexViewer重建时有效,但在使用Sitecore的内置工具时无效使用Sitecore的内置工具在一个由Sitecore6.2提供支持的网站上,我需要让用户能够有选择地从搜索结果中排除项目。为此,我添加了一个名为“包含在搜索结果中”的复选框字段,并创建了一个自定义数据库爬虫来检查该字段的值:~App_ConfigIncludeSearchIndexesWebsite.config:......~LIBsearchindexCustomCrawler.cs:使用Lucene.Net.Documents;使用Sitecore.Search.Crawlers;使用Sitecore.Data.Items;namespaceMyProject.Lib.Search.Indexing{publicclassCustomCrawler:DatabaseCrawler{//////确定项目是否应包含在索引中。/////////protectedoverrideboolIsMatch(Ite??mitem){if(item["includeinsearchresults"]!="1"){returnfalse;}返回base.IsMatch(item);}}}有趣的是,如果我使用IndexViewer应用重建索引,一切都正常。未选中“包含在搜索结果中”复选框的项目将不会包含在搜索索引中。但是,当我在Sitecore控制面板应用程序中使用搜索索引重建程序时,或者当IndexingManager自动更新搜索索引时,无论“包含在搜索结果中”复选框的状态如何,所有项目都会被包含在内。我还在自定义爬虫类中设置了许多断点,当我使用内置索引器重建搜索索引时,应用程序从未遇到任何断点。当我使用索引查看器时,它确实命中了我设置的所有断点。如何让Sitecore的内置索引过程尊重我的“包含在搜索结果中”复选框?我昨天和AlexShyba谈过,我们弄清楚了发生了什么。我的配置存在一些问题,导致一切无法正常工作:Alex还指出我的某些可扩展性设置不正确。具体来说:为了在CD实例上手动重建搜索索引,我还安装了RebuildDatabaseCrawlers.aspx(来自本文),因为我无权访问Sitecore后端。我想我已经找到了一个半途而废的解决方案。这是Sitecore.Shell.Applications.Search.RebuildSearchIndex.RebuildSearchIndexForm.Builder.Build()中的一个有趣片段,它由控制面板应用程序中的搜索索引生成器调用:for(inti=0;idatabase.IndexescontainsA一组不使用数据库爬虫重建索引的Sitecore.Data.Indexing.Index!换句话说,内置搜索索引器在重建搜索索引时使用完全不同的类,完全忽略web.config的搜索配置设置.为了解决这个问题,我更改了以下文件:~App_ConfigIncludeSearchIndexesWebsite.config:......~LIBSearchIndexesCustomIndex.cs:usingSitecore.Data;使用Sitecore.Data.Indexing;使用Sitecore.Diagnostics;命名空间MyProject.Lib.Search.Indexing{publicclassCustomIndex:Index{publicCustomIndex(stringname):base(name){}publicoverridevoidRebuild(Databasedatabase){Sitecore.Search.Indexindex=Sitecore.Search.SearchManager.获取索引(名称);if(index!=null){index.Rebuild();这种方法的唯一警告是它将为每个数据库重建索引,而不仅仅是选定的数据库(我猜这就是为什么Sitecore有两种完全独立的重建索引的方法)。Sitecore6.2同时使用旧的和新的搜索API,所以我相信索引的构建方式不同。CMS6.5(即将推出)仅使用较新的api-例如Sitecore.Search该工具共享的所有内容均无效。如果对你有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
