我使用默认的sitecore_web_index
创建了一个自定义搜索页面,一切似乎都有效,直到我迁移到具有单独的内容管理和内容交付服务器的测试环境。 CD服务器上的索引没有在发布时更新(CM服务器确实),如果我从控制面板重建索引,我会看到更新。所以我相信索引和搜索页面正常工作。
该指数使用的是onPublishEndAsync
策略。 Sitecore搜索和索引指南(http://sdn.sitecore.net/upload/sitecore7/70/sitecore_search_and_indexing_guide_sc70-usletter.pdf)第4.4.2节规定:
这个策略正如名称所暗示的那样。在初始化期间,它订阅
OnPublishEnd
事件并触发增量索引重建。使用单独的CM和CD服务器,此事件将通过EventQueue
对象触发,这意味着需要启用EventQueue
对象才能使此策略在此类环境中工作。
我的web.config有<setting name="EnableEventQueues" value="true"/>
同样来自搜索和索引指南:
处理 该策略将使用其初始化的数据库中的
EventQueue
对象:<param desc="database">web</param>
这意味着该策略成功执行有多个标准:
- 必须在配置文件的
<databases />
部分中指定此数据库。EnableEventQueues
设置必须设置为true。- 预配置数据库中的
EventQueue
表的条目日期应晚于索引的上次更新时间戳。
我不确定<param desc="database">web</param>
设置,因为CD服务器的发布目标(和数据库ID)是pub1
。我尝试将web
更改为pub1
,但之后两个服务器的索引都没有在发布时更新(因此它更改回web
)。
该系统最近从Sitecore 6.5升级到7.2,因此有几个索引使用Sitecore.Search
API,这些索引在发布时更新。
考虑到多个发布目标,EventQueue
上的数据库参数是否错误?还有其他我想念的东西,或者可能是我可以比较的CM - > CD环境的工作示例吗?
TIA
编辑:如果我不想在周五和今天坐在我旁边的同事可以确认,我会认为我会发疯。但现在,CD服务器正在获取索引的更新,但CM服务器没有获得更新。什么会使CM服务器现在无法获得更新?
我昨晚遇到了同样的问题,并且比创建新的IIS站点具有更可预测的解决方案:
解决方法是在每个CD服务器的ScalabilitySettings.config中设置不同的InstanceName,而不是依赖于自动生成的名称。
设置此值会立即解决问题,并在发布End Remote事件时恢复索引更新功能。
注意:如果您已在配置中定义了InstanceName,则需要对其进行更改才能使其生效。我只是使用日期增加InstanceName以强制进行更改。
这通过更改为新的IIS站点以与原始海报相同的方式有效地修复了同一问题,因为OP的修复程序将根据新的IIS站点名称修改自动生成的实例名称。
我认为OP的核心问题(以及我的实例)与EventQueue数据库与CD实例不同步,并且没有服务器能够确定是否已生成事件/需要更新哪些内容在索引中。通过更改实例名称(使用任一方法),服务器似乎是新实例,并从头开始进行EventQueue跟踪。
每次我在过去看过这样的问题时,都与Sitecore数据库的主要操作有关。例如,由于部署问题,还原,备份/还原到新的数据库名称或数据库回滚。我相信上述操作中的某些内容会导致EventQueues不同步,服务器会停止响应预期的事件。
我有这个问题,它让我疯了几个月。我发现答案在Lucene指数的重建策略中撒谎。当CM和CD位于IIS的单独实例中时,Lucene知道重建自身的唯一方法是让lucene观察EventQueue表,并认识到某个项目发生了变化,该项目位于根目录或子目录中。您在爬网程序节点中指定的root。您需要指定为保证此行为的重建策略的策略如下所示
<strategies hint="list:AddStrategy">
<strategy ref="contentSearch/indexUpdateStrategies/remoteRebuild" />
</strategies>
如果对内容传递服务器的远程实例使用任何其他重建策略,则只能在CM实例的文件系统中重建索引。
如果将来遇到这种情况,那对我有用的解决方案就是在IIS管理器中创建一个新站点。
我向Sitecore支持提交了一张票,但在一周没有收到回复后,我试图在我的测试服务器上重新创建我的开发环境。我将本地/ dev文件复制到测试CM服务器,在IIS中创建了一个新站点和AppPool,指向新复制的文件,并更新了connectionstrings.config以指向测试环境数据库。这工作(发布更新了CM Web索引)。
尝试将现有IIS站点指向我的新文件并使用新的AppPool后,从此站点发布将不会更新CM Web索引。
然后我将我的新网站指向预先存在的文件和预先存在的AppPool,它仍然有效。我禁用了预先存在的IIS站点,编辑了新站点上的绑定以匹配预先存在的站点,并且一切正常。
我不知道预先存在的网站有什么“错误”(我继承了系统,所以我不知道它是如何创建的),但比较绑定,基本设置和高级设置,它们是完美的匹配功能新的IIS站点。我希望我能分享这个问题的真正“原因”,但至少我找到了一个对我有用的解决方案。
感谢大家的回复。
[编辑]虽然这个解决方案对我有用,但请使用Laver的答案作为此问题的正确解决方案。
到目前为止,你似乎走在正确的轨道上。我相信绊倒你的是出版目标。据我所知,您使用pub1作为内容交付(CD)数据库。最佳做法是为每个数据库定义单独的索引。所以你真的应该配置你的CD服务器指向sitecore_pub1_index而不是sitecore_web_index。
您的CM和CD服务器应配置您的pub1数据库。看起来像这样的Sitecore包括补丁配置。如果可能的话,最好不要直接编辑web.config,而是使用include config patches。此示例显示了将在\ App_Config \ Include目录中的修补配置:
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<databases>
<database id="pub1" singleInstance="true" type="Sitecore.Data.Database, Sitecore.Kernel">
<param desc="name">$(id)</param>
<icon>Network/16x16/earth.png</icon>
<securityEnabled>true</securityEnabled>
<dataProviders hint="list:AddDataProvider">
<dataProvider ref="dataProviders/main" param1="$(id)">
<disableGroup>publishing</disableGroup>
<prefetch hint="raw:AddPrefetch">
<sc.include file="/App_Config/Prefetch/Common.config"/>
<sc.include file="/App_Config/Prefetch/Webdb.config"/>
</prefetch>
</dataProvider>
</dataProviders>
<proxiesEnabled>false</proxiesEnabled>
<proxyDataProvider ref="proxyDataProviders/main" param1="$(id)"/>
<archives hint="raw:AddArchive">
<archive name="archive"/>
<archive name="recyclebin"/>
</archives>
<cacheSizes hint="setting">
<data>20MB</data>
<items>10MB</items>
<paths>500KB</paths>
<itempaths>10MB</itempaths>
<standardValues>500KB</standardValues>
</cacheSizes>
</database>
</databases>
</sitecore>
</configuration>
然后,您需要在CM和CD服务器上配置pub1搜索索引。假设您正在使用lucene,那么补丁配置将如下所示:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<contentSearch>
<configuration type="Sitecore.ContentSearch.ContentSearchConfiguration, Sitecore.ContentSearch">
<indexes hint="list:AddIndex">
<index id="sitecore_pub1_index" type="Sitecore.ContentSearch.LuceneProvider.LuceneIndex, Sitecore.ContentSearch.LuceneProvider">
<param desc="name">$(id)</param>
<param desc="folder">$(id)</param>
<!-- This initializes index property store. Id has to be set to the index id -->
<param desc="propertyStore" ref="contentSearch/databasePropertyStore" param1="$(id)" />
<configuration ref="contentSearch/indexConfigurations/defaultLuceneIndexConfiguration" />
<strategies hint="list:AddStrategy">
<!-- NOTE: order of these is controls the execution order -->
<strategy ref="contentSearch/indexUpdateStrategies/onPublishEndAsync" />
</strategies>
<commitPolicyExecutor type="Sitecore.ContentSearch.CommitPolicyExecutor, Sitecore.ContentSearch">
<policies hint="list:AddCommitPolicy">
<policy type="Sitecore.ContentSearch.TimeIntervalCommitPolicy, Sitecore.ContentSearch" />
</policies>
</commitPolicyExecutor>
<locations hint="list:AddCrawler">
<crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
<Database>pub1</Database>
<Root>/sitecore</Root>
</crawler>
</locations>
</index>
</indexes>
</configuration>
</contentSearch>
</sitecore>
</configuration>
您现在有一个pub1数据库和搜索索引设置。您应该已将pub1设置为Sitecore中的远程发布目标。您还声明在CM和CD服务器上将EnableEventQueues设置配置为true。
这就是你应该需要的。 onPublishEndAsync将密切关注pub1数据库中的EventQueue表。当您发布到pub1发布目标时,您应该在CD服务器的Sitecore日志* .txt文件中看到与此类似的条目:
ManagedPoolThread #7 23:21:00 INFO Job started: Index_Update_IndexName=sitecore_pub1_index
ManagedPoolThread #7 23:21:00 INFO Job ended: Index_Update_IndexName=sitecore_pub1_index (units processed: )
注意:处理的单位似乎从未准确更新,通常为空白。我认为这是一个Sitecore错误,但从来没有挖到足以确定为什么它没有正确显示在日志中。您可以使用Luke(如果您使用的是Lucene)再次验证索引是否已按预期更新。
检查你的publish:end:remote
事件,看看那里是否有任何处理程序。如果是这样,请尝试删除所有处理程序以确保它们不会导致任何错误。
从Sitecore 6迁移到7时,我遇到了类似的问题.Sitecore 7中远程发布的EventArgs
不同。新类型是PublishEndRemoteEventArgs
。
这是我们在您的应用程序中所做的解决方案,我们已经设置了Web和Pub数据库,并创建了将其指向pub的附加发布策略
<onPublishEndAsyncPub type="Sitecore.ContentSearch.Maintenance.Strategies.OnPublishEndAsynchronousStrategy,
Sitecore.ContentSearch">
<param desc="database">pub</param>
<!-- whether full index rebuild should be triggered if the number of items in Event Queue exceeds
Config.FullRebuildItemCountThreshold -->
<CheckForThreshold>true</CheckForThreshold>
</onPublishEndAsyncPub>
在索引部分中将新创建的策略设置为pub索引
<index id="sitecore_pub_index" type="Sitecore.ContentSearch.SolrProvider.SolrSearchIndex, Sitecore.ContentSearch.SolrProvider">
<param desc="name">$(id)</param>
<param desc="core">itembuckets</param>
<param desc="propertyStore" ref="contentSearch/databasePropertyStore" param1="$(id)" />
<strategies hint="list:AddStrategy">
<strategy ref="contentSearch/indexUpdateStrategies/onPublishEndAsyncPub" />
<!--<strategy ref="contentSearch/indexUpdateStrategies/remoteRebuild" />-->
</strategies>
<locations hint="list:AddCrawler">
<crawler type="Sitecore.ContentSearch.SitecoreItemCrawler, Sitecore.ContentSearch">
<Database>pub</Database>
<Root>/sitecore</Root>
</crawler>
</locations>
</index>
如果您使用Sitecore可伸缩性设置,请确保这是正确的。
不在CD服务器上触发索引的原因主要是由于您的事件队列。您可以执行的一项快速检查是查看Core数据库的EventQueue表中是否存在发布已完成的事件。
另外,检查Sitecore.ContentSearch.config,因为当发布结束时,它将触发重建索引。
谢谢
@ Laver的修复确实对我们有用,但由于我们的InstanceName
是通过我们的构建过程生成的,所以我不想改变它。我做了一些挖掘,发现问题的根本原因是数据存储在core
数据库的Properties
表中。
您可以在this Sitecore Stack Exchange Q&A中查看完整的文档,但解决方案如下所示。
该解决方案需要App Pool循环才能生效:
- 对
core
数据库执行以下SQL语句DELETE FROM [Properties] WHERE [Key] LIKE '%_LAST_UPDATED_TIMESTAMP%'
- 回收CD的AppPool
在此之后,您将需要重建CD上的索引,以便它们获取在索引被破坏时遗漏的任何更改。