如何在Sitecore中配置Lucene以仅索引主数据库上项目的最新版本?

the*_*man 6 c# lucene indexing search sitecore

我认识到这是网络数据库上的一个有争议的问题,所以这个问题适用于主数据库...

我在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>
Run Code Online (Sandbox Code Playgroud)

我像这样查询索引(我在SortableIndexSearchContext这个答案中使用了techphoria414 :如何使用新的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);
Run Code Online (Sandbox Code Playgroud)

hits是我索引中搜索命中的集合.当我迭代时,hits我可以看到Sitecore中有相同项目的许多重复项,每个版本的项目有1个.

然后,我执行以下操作以获得SearchResultCollection:

SearchResultCollection results = hits.FetchResults(0, hits.Length);
Run Code Online (Sandbox Code Playgroud)

这将所有重复项组合到一个SearchResult对象中.此对象表示特定项目的1个版本,并且具有一个名为的属性,该属性SubResultsSearchResult表示所有其他项目版本的s 的集合.

这是我的问题:

所代表的项目的版本SearchResult不是该项目的当前发行版!它似乎是一个随机选择的版本(无论搜索方法在索引中首先命中).最新版本包括在SubResults收集,但是.

例如:

SearchResult
 |
 |- Version 8 // main result
 ...
 |- SubResults
      |
      |- Version 9 // latest version
      |- Version 3
      |- Version 5
      ... // all versions in random order
Run Code Online (Sandbox Code Playgroud)

如何防止在主数据库上发生这种情况?要么阻止Lucene索引旧版本的项目,要么通过对结果集进行一些操作来获取最新版本的SubResults

顺便说一句,为什么Lucene还要为旧版本的商品编制索引呢?当然,这对于在您的网站上搜索内容毫无意义,因为旧版本不可见?

And*_*ess 10

您可以实现覆盖以下内容的自定义搜寻器:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以确保只有最新版本的项目才会进入您的索引,因此它将成为拉出所述索引的唯一项目

您需要更新配置文件以设置索引的正确类型


Sti*_*Vos 8

Sitecore 7中,字段_latestversion被添加到索引中,包含最新版本的"1"(其他版本具有空值).


Mar*_*Put 7

如果您让Lucene在您的Web数据库而不是Master中进行搜索,则它应该仅对最后发布的版本编制索引.

<Database>web</Database>
Run Code Online (Sandbox Code Playgroud)