0

我们网站上的内容搜索(使用检查)已损坏。这些问题可以分为三个不同的类别:

搜索正在返回已删除的页面:我不确定如何从搜索结果中删除已删除的内容。有没有办法添加过滤条件来排除已删除的页面?

搜索正在从所有网站返回内容:我们在一个 Umbraco 实例中为两个不同的国家(澳大利亚和新西兰)运行两个网站。问题是搜索结果正在返回两个站点的页面。我们不需要新西兰搜索结果上的 AU 页面,反之亦然。如何创建搜索查询以将其限制为特定的根节点 ID?

在没有模板的情况下打开页面:一些内容节点没有与之关联的模板,并且旨在作为父节点的一部分显示。有没有办法将搜索限制为特定的文档类型?但是,如果在子节点上找到内容,是否会调出具有特定文档类型的父节点?

我可能在一篇文章中问了太多问题,但我想其他用户可能以前也遇到过这样的问题。

我现在使用的代码:

private List<SiteSearchResult> GetSiteResults(string query, out int totalResults)
{
    var criteria = ExamineManager.Instance
        .SearchProviderCollection["WebSearcher"]
        .CreateSearchCriteria(IndexTypes.Content);
    var filter =
        criteria.GroupedOr(
            new[]
            {
                "nodeName", "heading", "content", "metaKeywords", "title", "umbracoNaviHide", "umbracoUrlName",
                "umbracoUrlAlias", "metaCategory", "metaDescription", "metaTags", "heading", "subHeading",
                "quote", "author", "socialCopy", "socialTitle", "socialTitle2", "thumbTitle", "thumbTitle2",
                "thumbCopy", "thumbQuote", "url", "location"
            }, query)
            .Compile();

    var searchResults =
        ExamineManager.Instance.SearchProviderCollection["WebSearcher"].Search(filter)
            .OrderByDescending(x => x.Score);
    totalResults = searchResults.Count();
    var results = new List<SiteSearchResult>();

    foreach (var item in searchResults)
    {
        var heading = "";
        var copy = "";
        var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);

        var url = umbracoHelper.Url(item.Id, UrlProviderMode.Relative);

        if (url.Length == 0)
        {
            continue;
        }

        if (url.StartsWith("/forms/"))
        {
            continue;
        }

        // Do many things here

        results.Add(r);
    }

    return results;
}
4

1 回答 1

2

搜索返回已删除的页面:

不确定这是否有帮助,但您可以从索引中排除未发布/受保护的结果。您可以在 ExamineSettings.config 文件中执行此操作。对你来说,它应该看起来像这样:

<add name="WebIndexer" 
     type="UmbracoExamine.UmbracoContentIndexer, UmbracoExamine" 
     supportUnpublished="false" 
     supportProtected="false" 
     analyzer="Lucene.Net.Analysis.Standard.StandardAnalyzer, Lucene.Net" />

supportUnpublished 和 supportProtected 标志定义是否应将未发布/受保护的内容存储在特定索引中。

在没有模板的情况下调出页面

同样,您可以更改您的 ExamineIndex.config 文件并指定哪些文档类型应该被索引,哪些不应该。例如:

<IndexSet SetName="WebIndexSet" IndexPath="~/App_Data/TEMP/ExamineIndexes/{machinename}/Features/">
  <IndexAttributeFields>
    <add Name="id" EnableSorting="true" />
  </IndexAttributeFields>
  <IndexUserFields>     
    <add Name="exampleField" />
  </IndexUserFields>
  <IncludeNodeTypes>
    <add Name="DocumentType1" />
  </IncludeNodeTypes>
</IndexSet>

上面的索引将只包含文档类型“DocumentType1”的节点,而且它只会存储系统中的“id”字段(并启用对其进行排序)和用户定义的字段中的“exampleField”。您还可以使用 EncludeNodeType 来指定哪些文档类型不应出现在索引中。

搜索正在从所有站点返回内容:

如果这两个站点中使用的文档类型不同,那么为每个站点创建两个单独的索引应该可以解决这个问题。但是,如果不是,我目前不知道如何以适当的方式解决这个问题。快速修复可能是向包含值的文档类型添加一个字段,该值指定文档是来自新西兰还是澳大利亚地区。然后您可以将其添加到索引并在搜索时对其进行过滤。很可能有更好的方法来做到这一点。

检查文档

如果您需要一些有关如何处理检查索引和搜索器的信息,您可以随时查看这里。

于 2015-11-17T15:56:31.713 回答