c#Sitecore搜索:显示组件的使用位置

c#Sitecore搜索:显示组件的使用位置,c#,search,lucene,sitecore,C#,Search,Lucene,Sitecore,通过编写以下内容,我在Sitecore中实现了一个简单的搜索功能: string searchStr = Server.UrlDecode(WebUtil.GetQueryString("searchStr")); FullTextQuery query = new FullTextQuery(searchStr); SearchHits hits = indexSearchContext.Search(query, int.MaxValue); SearchResultCollection

通过编写以下内容,我在Sitecore中实现了一个简单的搜索功能:

string searchStr = Server.UrlDecode(WebUtil.GetQueryString("searchStr"));

FullTextQuery query = new FullTextQuery(searchStr);
SearchHits hits = indexSearchContext.Search(query, int.MaxValue);
SearchResultCollection results = hits.FetchResults(0, 100);
这将正确获取所有出现的searchStr。然后,我循环查看结果并显示:

foreach (var result in results)
{
    Item hit = result.GetObject<Item>();
    if (hit != null)
    {
        string hitText = GenerateHitText(hit);
        LiteralControl hitControl = new LiteralControl(hitText);
        pnResultsPanel.Controls.Add(hitControl);
     }
}
foreach(结果中的var结果)
{
Item hit=result.GetObject();
如果(命中!=null)
{
字符串hitText=生成hitText(命中);
LiteralControl hitControl=新的LiteralControl(hitText);
pnResultsPanel.Controls.Add(hitControl);
}
}
问题是我在页面上有文本框组件,搜索时也会返回这些组件。我不希望用户在搜索时看到组件,我只希望他们看到使用该组件的页面。我想它看起来有点像这样:

foreach (var result in results)
{
    Item hit = result.GetObject<Item>();
    if (hit != null)
    {
        if (//hit is a component) 
        {
            foreach (//page where hit (the component) is placed) 
            {
                //Do something
            }
        }
    }
}
foreach(结果中的var结果)
{
Item hit=result.GetObject();
如果(命中!=null)
{
if(//hit是一个组件)
{
foreach(//放置hit(组件)的页面)
{
//做点什么
}
}
}
}
有人能帮我写些能达到这个目的的东西吗?
谢谢。

如果您仅将组件项用作组件(即它们本身不可浏览),我认为这应该相当简单:

foreach (var result in results)
{
    Item hit = result.GetObject<Item>();
    if (hit != null)
    {
        // Potentially you need to just check the __Renderings or
        // __FinalRenderings field here instead
        if (hit.Visualization.Layout == null) 
        {
            foreach (Sitecore.Globals.LinkDatabase.GetReferrers(item)) 
            {
                //Do something
            }
        }
    }
}
foreach(结果中的var结果)
{
Item hit=result.GetObject();
如果(命中!=null)
{
//您可能只需要检查渲染或
//请改为此处的FinalRenderings字段
if(hit.Visualization.Layout==null)
{
foreach(Sitecore.Globals.LinkDatabase.getreferers(项目))
{
//做点什么
}
}
}
}

如果您也将组件项用作常规页面,则可能会有点复杂

如果您想实现完整内容搜索,Lucene可能不是您的最佳选择。虽然如果您开始实施它,您所要求的是可能的,但是您可能会发现一些问题

最好的方法是将内容包括在索引中(参见Mareks评论)。但在开始之前分析您的解决方案,因为在更新内容时可能会出现问题

问题是,有时并非所有组件都与页面直接相关(通过数据源),否则您可以使用链接数据库、计算字段等。。。但不幸的是,情况并非总是如此。例如,当您有一个获取数据源的渲染时,该数据源实际上是您真正显示的项的父项。。。同时,考虑到这可能不是一个问题,但它可能会限制你在未来的发展。p> 对于内容更新:如果您的组件内容发生更改,您的搜索需要知道。如果您的内容嵌入到索引中(这是最快的方法),则可能会出现问题。您需要一个解决方案来更新正确的项目,如果它们没有真正链接,那么就不那么容易了

当然,还有一些其他的选择——比如每天重建一次索引


因此,这一切都取决于您的解决方案:结构、数据量。。。(不要只考虑“现在”,但也要为将来考虑)。

你可能想改变你的方法——而不是对组件数据源进行索引,在页面的“<代码>内容> <代码>字段中对所有组件内容进行索引。看这个问题:好吧,我试着跟踪你的链接。我实现了VisualizationField.cs,但当我尝试在索引内的Web.config中插入时,它给了我一个运行时错误“找不到添加方法:AddDynamicFields(类型:Sitecore.Search.Crawlers.DatabaseCrawler)”。我还需要添加其他内容吗?我最近一直在玩的一件事是在我所有页面项目的文档中添加一个
html
字段,作为一个计算索引字段,该字段保存页面的全文html。@ZacharyKniebel:请注意全文html索引,您将使用诸如页眉/页脚之类的内容,wchih可能实际上不想搜索。。。请看一看,特别是文档/配置部分,以了解处理此问题的一种方法。@jammykam:我完全同意。在我的实验中,我主要是在控制器操作中使用条件(基于渲染参数)来确定渲染是否应该被索引。我不是这个解决方案的超级粉丝,我更愿意为我的索引创建一个单独的设备。因此,唯一的问题是确保作者添加到页面中的内容以及想要索引的内容也添加到新设备中。我还没来得及跳到这一步,虽然刚刚看到马雷克的评论,这可能是更好的选择——我认为这将比上面的表现更好——特别是在规模上。