【问题标题】:Rebuilding search index on CD environment在 CD 环境下重建搜索索引
【发布时间】:2013-07-22 10:14:24
【问题描述】:

我正在更改我的代码以使用旧 Lucene 方式的 Sitecore.Search。为此,我使用来自ADC module 的爬虫。我目前没有使用搜索器,只是模块中的爬虫(尽管我们希望在稍后阶段更改为)。
我已经设法让索引和搜索功能在我的 CM 环境中完美运行,但是当我尝试重建时,CD 环境不断给出以下错误:

找不到配置节点:databases/database[@id='core']。

我正在运行以重建搜索索引的代码在 CD 上是:

foreach (var options in from ListItem item in cblIndexes.Items 
                        where item.Selected           
                        select new JobOptions("RebuildSearchIndex", "index", global::Sitecore.Client.Site.Name, new Builder(item.Value), "Rebuild") { AfterLife = TimeSpan.FromMinutes(1.0) })
           {
               JobManager.Start(options);
           }

在 CM 上运行此代码可以正常工作。
我对其中一个失败索引的配置:

<search>
      <configuration>
        <indexes>
          <index id="PressReleaseIndex" type="Sitecore.Search.Index, Sitecore.Kernel">
            <param desc="name">$(id)</param>
            <param desc="folder">$(id)</param>
            <Analyzer ref="search/analyzer" />
            <locations hint="list:AddCrawler">
              <web ref="search/crawlers/PressReleaseIndex" param1="web" />
            </locations>
          </index>
        </indexes>
      </configuration>
      <crawlers>
        <PressReleaseIndex type="scSearchContrib.Crawler.Crawlers.AdvancedDatabaseCrawler,scSearchContrib.Crawler">
          <Database>$(1)</Database>
          <Root>/sitecore/content/home/newsroom</Root>
          <IndexAllFields>false</IndexAllFields>

          <include hint="list:IncludeTemplate">
            <pressrelease>{91DB1CBC-32F8-4344-A974-7F4FE5F07668}</pressrelease>
          </include>

          <include hint="list:IncludeField">
            <title>{F8C6E41E-3C9F-45F6-8409-61F5C8F2BF19}</title>
            <shortdescription>{D25294E9-03C1-4E62-968B-5410AAAD0863}</shortdescription>
            <body>{A0AD83E2-1099-407C-B8D7-C123FDAAD5DD}</body>
            <releasedate>{D0B594BC-2ED6-4A0E-A050-3243CD044040}</releasedate>
          </include>

          <fieldCrawlers hint="raw:AddFieldCrawlers">
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.LookupFieldCrawler,scSearchContrib.Crawler" fieldType="Droplink" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.LookupFieldCrawler,scSearchContrib.Crawler" fieldType="Droptree" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.DateFieldCrawler,scSearchContrib.Crawler" fieldType="Datetime" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.DateFieldCrawler,scSearchContrib.Crawler" fieldType="Date" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.NumberFieldCrawler,scSearchContrib.Crawler" fieldType="Number" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="Multilist" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="Treelist" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="TreelistEx" />
            <fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="Checklist" />
          </fieldCrawlers>

          <dynamicFields hint="raw:AddDynamicFields">
            <dynamicField type="Sapient.Practice.Ccmp.Common.SitecoreSearch.DynamicFields.ReleaseYearField,Sapient.Practice.Ccmp.Common" name="_releaseyear" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <dynamicField type="Sapient.Practice.Ccmp.Common.SitecoreSearch.DynamicFields.ReleaseMonthField,Sapient.Practice.Ccmp.Common" name="_releasemonth" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" />
          </dynamicFields>

          <fieldTypes hint="raw:AddFieldTypes">
            <!-- Text fields need to be tokenized -->
            <fieldType name="single-line text" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <fieldType name="multi-line text" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <fieldType name="word document" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <fieldType name="html" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <fieldType name="rich text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <fieldType name="memo" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <fieldType name="text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
            <fieldType name="date" storageType="YES" indexType="TOKENIZED" vectorType="NO" boost="1f" />
          </fieldTypes>
        </PressReleaseIndex>

当解决方案仍在 Sitecore 6.3.1(我们升级到 Sitecore 6.5 更新 5)时,我已经查看了 Staging Guide,并删除了对 Core 数据库的所有引用。

当我转到 CD 上的 ShowConfig 页面并查找“核心”时,我没有找到任何结果。 AppSettings.config、ConnectionStrings.config 或我拥有的任何其他配置文件中也没有对 Core 数据库的引用。据我发现,我也没有引用硬编码的核心数据库(否​​则我会在此之前遇到问题)。

我无法弄清楚 Core 数据库将在何处被引用。
stacktrace 的完整异常:

Exception: System.Reflection.TargetInvocationException
Message: Exception has been thrown by the target of an invocation.
Source: mscorlib
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Sitecore.Reflection.ReflectionUtil.InvokeMethod(MethodInfo method, Object[] parameters, Object obj)
   at Sitecore.Reflection.MethodInstance.Invoke()
   at Sitecore.Jobs.JobRunner.RunMethod(JobArgs args)
   at (Object , Object[] )
   at Sitecore.Pipelines.PipelineMethod.Invoke(Object[] parameters)
   at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args)
   at Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args, String pipelineDomain, Boolean failIfNotExists)
   at Sitecore.Pipelines.CorePipeline.Run(String pipelineName, PipelineArgs args, String pipelineDomain)
   at Sitecore.Jobs.Job.ThreadEntry(Object state)

Nested Exception

Exception: System.InvalidOperationException
Message: Could not find configuration node: databases/database[@id='core']
Source: Sitecore.Kernel
   at Sitecore.Diagnostics.Assert.IsTrue(Boolean condition, String format, Object[] args)
   at Sitecore.Configuration.Factory.GetConfigNode(String xpath, Boolean assert)
   at Sitecore.Configuration.Factory.CreateObject(String configPath, String[] parameters, Boolean assert)
   at Sitecore.Configuration.Factory.CreateObject(String configPath, Boolean assert)
   at Sitecore.Configuration.Factory.GetDatabase(String name, Boolean assert)
   at Sitecore.Configuration.Factory.GetDatabase(String name)
   at Sitecore.Web.UI.HtmlControls.Data.LookupSources.GetDatabase(String source)
   at Sitecore.Data.Fields.CustomField.GetDatabase()
   at Sitecore.Data.Fields.DelimitedField.ValidateLinks(LinksValidationResult result)
   at Sitecore.Links.ItemLinks.AddLinks(Field field, List`1 links, ItemLinkState linkState)
   at Sitecore.Links.ItemLinks.GetLinks(ItemLinkState linkState, Boolean allVersions, Boolean includeStandardValuesLinks)
   at Sitecore.Search.Crawlers.DatabaseCrawler.GetItemLinks(Item item)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddSpecialFields(Document document, Item item)
   at Sitecore.Search.Crawlers.DatabaseCrawler.IndexVersion(Item item, Item latestVersion, IndexUpdateContext context)
   at scSearchContrib.Crawler.Crawlers.AdvancedDatabaseCrawler.IndexVersion(Item item, Item latestVersion, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddItem(Item item, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddTree(Item root, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddTree(Item root, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddTree(Item root, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddTree(Item root, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddTree(Item root, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.AddTree(Item root, IndexUpdateContext context)
   at Sitecore.Search.Crawlers.DatabaseCrawler.Add(IndexUpdateContext context)
   at Sitecore.Search.Index.Rebuild()
   at Saga.Sitecore.Web.Builder.Rebuild()

【问题讨论】:

  • 您的 CD 环境在没有核心数据库的情况下是否正常工作?
  • 是的。这已经在大约 2 年前完成(并且一直运行良好),所以不应该是我假设的原因
  • CD 和 CM 环境是否安装了相同的 .NET 框架版本? IE。一个有4个,另一个有4.5个?
  • CD 和 CM 环境在同一个盒子上(问题发生在 DEV 服务器上)

标签: search lucene sitecore sitecore6


【解决方案1】:

我认为该问题与您的索引配置无关。查看您的堆栈跟踪,当您的搜索爬虫尝试获取分隔字段(多列表、树列表等)的链接(引用)时,异常确实源于 Sitecore.Web.UI.HtmlControls.Data.LookupSources.GetDatabase 方法。 .).

   at Sitecore.Configuration.Factory.GetDatabase(String name)
   at Sitecore.Web.UI.HtmlControls.Data.LookupSources.GetDatabase(String source)
   at Sitecore.Data.Fields.CustomField.GetDatabase()
   at Sitecore.Data.Fields.DelimitedField.ValidateLinks(LinksValidationResult result)
   at Sitecore.Links.ItemLinks.AddLinks(Field field, List`1 links, ItemLinkState linkState)
   at Sitecore.Links.ItemLinks.GetLinks(ItemLinkState linkState, Boolean allVersions, Boolean includeStandardValuesLinks)
   at Sitecore.Search.Crawlers.DatabaseCrawler.GetItemLinks(Item item)

使用反射器,我们可以查看 Sitecore.Data.Fields.CustomField.GetDatabase() 方法,如果关联的字段在其“源”字段中有值,则该方法调用 LookupSources.GetDatabase 方法。 LookupSources.GetDatabase 方法尝试分析“源”字段以确定在哪个数据库中查询相关分隔字段中的源项。一些源字段可以使用“db=”参数显式设置要查询源项目的数据库。

所以,长话短说,当您在索引配置中使用&lt;IndexAllFields&gt;true&lt;/IndexAllFields&gt; 时,您的爬虫试图索引的字段之一有一个“源”字段,其中包含对核心数据库的引用。

您将&lt;IndexAllFields /&gt; 值设置为false,然后显式包含或排除要索引的字段的解决方案当然是有效的,但如果您想追查问题的根本原因,您可能需要仔细查看“来源”字段。

【讨论】:

  • 推荐的做法是不要删除核心数据库,所以我想我会在有时间的时候添加它,这也将解决我的问题。附带说明一下,Sitecore 支持向我指出了这个工具来快速搜索罪魁祸首:marketplace.sitecore.net/en/Modules/… 还没有时间安装它,但我想我会为其他有同样问题的人放弃链接: -)
【解决方案2】:

它似乎与配置中的&lt;IndexAllFields&gt; 有关。我的第二个索引将此设置为 true。我将它设置为 false,做了IncludeFieldsExcludeFields,现在它正在成功构建。

我仍然想知道为什么它会抛出这个错误,因为 Core 数据库之前已被删除。可能是标准字段?

【讨论】:

  • 是的,它可以是标准字段。在您的例外中,有 Sitecore.Data.Fields.DelimitedField.ValidateLinks,然后是 Sitecore.Configuration.Factory.GetDatabase。也许有一些来自核心数据库的项目参考。
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2014-06-24
  • 2016-10-18
  • 1970-01-01
相关资源
最近更新 更多