我认识到这是网络数据库上的一个有争议的问题,所以这个问题适用于主数据库…
我在Sitecore 6.4.1中设置了自定义索引,如下所示:
<index id="search_content_US" type="Sitecore.Search.Index,Sitecore.Kernel"> <param desc="name">$(id)</param> <param desc="folder">_search_content_US</param> <Analyzer ref="search/analyzer" /> <locations hint="list:AddCrawler"> <search_content_home type="Sitecore.Search.Crawlers.DatabaseCrawler,Sitecore.Kernel"> <Database>master</Database> <Root>/sitecore/content/usa home</Root> <Tags>home content</Tags> </search_content_home> </locations> </index>
我像这样查询索引(我在这个答案中使用了techphoria414的SortableIndexSearchContext:How to sort/filter using the new Sitecore.Search API):
private SearchHits GetSearchResults(SortableIndexSearchContext searchContext,string searchTerm) { CombinedQuery query = new CombinedQuery(); query.Add(new FullTextQuery(searchTerm),QueryOccurance.Must); return searchContext.Search(query,Sort.RELEVANCE); } ... SearchHits hits = GetSearchResults(searchContext,searchTerm);
hits是我索引中搜索命中的集合.当我遍历点击时,我可以看到Sitecore中有相同项目的许多重复项,每个版本的项目有1个.
然后,我执行以下操作以获取SearchResultCollection:
SearchResultCollection results = hits.FetchResults(0,hits.Length);
这将所有重复项组合到一个SearchResult对象中.此对象表示特定项目的1个版本,并且具有名为SubResults的属性,该属性是SearchResults的集合,表示所有其他项目版本.
这是我的问题:
SearchResult表示的项目版本不是该项目的当前发布版本!它似乎是一个随机选择的版本(无论搜索方法在索引中首先命中).但是,最新版本包含在SubResults集合中.
例如.:
SearchResult | |- Version 8 // main result ... |- SubResults | |- Version 9 // latest version |- Version 3 |- Version 5 ... // all versions in random order
如何防止在主数据库上发生这种情况?要么阻止Lucene索引旧版本的项目,要么通过对结果集进行一些操作来从SubResults获取最新版本?
顺便说一句,为什么Lucene还要为旧版本的商品编制索引呢?当然,这对于在您的网站上搜索内容毫无意义,因为旧版本不可见?
解决方法
您可以实现覆盖以下内容的自定义搜寻器:
public class IndexCrawler : DatabaseCrawler { protected override void IndexVersion(Item item,Item latestVersion,Sitecore.Search.IndexUpdateContext context) { if (item.Versions.Count > 0 && item.Version.Number != latestVersion.Version.Number) return; base.IndexVersion(item,latestVersion,context); } }
这样可以确保只有最新版本的项目才会进入您的索引,因此它将成为拉出所述索引的唯一项目
您需要更新配置文件以设置索引的正确类型