我使用默认的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
表的条目日期应晚于 index的最后更新时间戳。
我不确定<param desc="database">web</param>
设置,因为CD服务器的发布目标(和数据库ID)是pub1
。我尝试将web
更改为pub1
,但之后两个服务器的索引都没有在发布时更新(因此它已更改回web
)。
系统最近从Sitecore 6.5升级到7.2,因此有一些使用Sitecore.Search
API的索引,这些索引会在发布时更新。
考虑到多个发布目标,EventQueue
上的数据库参数是否错误?还有其他我想念的东西,或者是一个CM的工作示例 - &gt; CD环境我可以比较吗?
TIA
编辑: 如果我不想在周五和今天坐在我旁边的同事可以确认,我会认为我会发疯。但现在,CD服务器正在获取索引的更新,但CM服务器没有获得更新。是什么让CM服务器现在无法获得更新?
答案 0 :(得分:13)
我昨晚遇到了同样的问题,并且比创建一个新的IIS站点具有更可预测的解决方案:
解决方法是在每个CD服务器的ScalabilitySettings.config中设置不同的InstanceName,而不是依赖于自动生成的名称。
立即设置此值 解决了问题,并在发布End Remote事件时恢复了索引更新功能。
注意:如果您已经在配置中定义了 InstanceName,那么您需要更改才能使其生效。我只是使用日期增加InstanceName以强制进行更改。
这可以通过更改为新的IIS站点以与原始海报相同的方式有效地修复同一问题,因为OP的修复程序会根据新的IIS站点名称修改自动生成的实例名称。
我认为OP(以及我的实例)的核心问题与EventQueue数据库与CD实例不同步,并且没有服务器能够确定事件已生成/内容需要在索引中更新。通过更改实例名称(使用任一方法),服务器似乎是新实例,并从头开始使用EventQueue跟踪。
每次我在过去看过这样的问题时,都与Sitecore数据库的主要操作有关。例如,由于部署问题,还原,备份/还原到新的数据库名称或数据库回滚。我相信上述操作中的某些内容会导致EventQueues不同步,服务器会停止响应预期的事件。
答案 1 :(得分:2)
如果将来有人遇到这种情况,那么适合我的解决方案是在IIS管理器中创建一个新站点。
我向Sitecore支持提交了一张票,但在一周没有收到回复之后,我试图在我的测试服务器上重新创建我的开发环境。我将本地/ dev文件复制到测试CM服务器,在IIS中创建了一个新站点和AppPool,指向新复制的文件,并更新了connectionstrings.config以指向测试环境数据库。这有效(发布更新了CM网络索引)。
尝试将现有IIS站点指向我的新文件并使用新的AppPool后,从此站点发布将不会更新CM Web索引。
然后我将我的新网站指向预先存在的文件和预先存在的AppPool,它仍然有用。我禁用了预先存在的IIS站点,编辑了新站点上的绑定以匹配预先存在的站点,并且一切正常。
我不知道&#34;错误&#34;使用预先存在的站点(我继承了系统,因此我不知道它是如何创建的),但是比较绑定,基本设置和高级设置,它们与功能性新的IIS站点完美匹配。我希望我有真正的&#34;原因&#34;要分享的问题,但至少我找到了一个适合我的解决方案。
感谢所有回复。
[编辑]虽然此解决方案对我有用,但请使用Laver的答案作为此问题的正确解决方案。
答案 2 :(得分:2)
我有这个问题,它让我疯了几个月。我发现答案在Lucene指数的重建策略中撒谎。当CM和CD位于IIS的单独实例中时,Lucene知道重建自身的唯一方法是让lucene观察EventQueue表,并认识到某个项目发生了变化,该项目位于根目录或子目录中。您在爬网程序节点中指定的root。您需要指定作为重建策略以保证此行为的策略位于
之下
<strategies hint="list:AddStrategy">
<strategy ref="contentSearch/indexUpdateStrategies/remoteRebuild" />
</strategies>
&#13;
如果对内容传递服务器的远程实例使用任何其他重建策略,则只能在CM实例的文件系统中重建索引。
答案 3 :(得分:0)
到目前为止,你似乎走在了正确的轨道上。我相信绊倒你的是出版目标。据我所知,您使用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)再次验证索引已按预期更新。
答案 4 :(得分:0)
检查你的publish:end:remote
事件,看看那里是否有任何处理程序。如果是这样,请尝试删除所有处理程序以确保它们不会导致任何错误。
从Sitecore 6迁移到7时,我遇到了类似的问题.Sitecore 7中远程发布的EventArgs
不同。新类型为PublishEndRemoteEventArgs
。
答案 5 :(得分:0)
以下是我们在我们的应用程序中所做的解决方案,我们已经设置了Web和Pub数据库并创建了另外的publishStrategy,将其指向了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
<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>
答案 6 :(得分:0)
如果您使用Sitecore可伸缩性设置,请确保这是正确的。
在CD服务器上未触发索引的原因主要是由于您的事件队列。您可以执行的一个快速检查是查看Core数据库的EventQueue表中是否存在发布已完成的事件。
另外,请检查 Sitecore.ContentSearch.config ,因为发布结束时会触发重建索引。
由于
答案 7 :(得分:0)
@Laver的修复程序确实对我们有用,但是由于InstanceName
是通过构建过程生成的,所以我不想更改它。我做了一些进一步的挖掘,发现问题的根本原因是存储在core
数据库的Properties
表中的数据。
您可以在this Sitecore Stack Exchange Q&A中看到完整的文档,但是下面复制了该解决方案。
该解决方案需要AppPool回收才能生效:
- 针对
core
数据库执行以下SQL语句DELETE FROM [Properties] WHERE [Key] LIKE '%_LAST_UPDATED_TIMESTAMP%'
- 回收CD的AppPool
此后,您将要重建CD上的索引,以便 他们获取索引中断时错过的所有更改。