<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Peter Dempsey</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/peter_dempsey/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/feed.xml</link>
    <description>Principal Premier Field Engineer (Surface Hub / HoloLens / SharePoint)</description>
    <lastBuildDate>Tue, 16 Apr 2019 06:15:13 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Surface Hub and Active Directory Best Practices: Removing Inactive Computer Objects</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/surface-hub-and-active-directory-best-practices-removing-inactive-computer-objects</link>
      <pubDate>Mon, 08 May 2017 13:42:46 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/?p=256</guid>
      <description><![CDATA[You have the option on how to administer the Surface Hub. This choice is made during the initial out...]]></description>
      <content:encoded><![CDATA[<span style="color: #000000;font-family: Calibri">You have the option on how to administer the Surface Hub. This choice is made during the initial out of box experience setup. If you select the Active Directory User or Group option, a computer object for the Surface Hub will be created on your active directory. It is critical that the computer object is not removed or you will end up in a situation where it is impossible to authenticate as an administrator on the Surface Hub.</span>

<span style="color: #000000;font-family: Calibri">Many Active Directory environments run cleanup scripts to remove unused computer objects. These scripts can potentially remove the computer object for an active Surface Hub if they are not designed with the Hub in mind. It is common in some AD environments to use the last login timestamp to determine if a computer object is active or not. The Surface Hub does not require authentication for users, so this timestamp is only set when an admin authenticates to settings. This is not something that is required in the day to day usage of the Surface Hub, so it may not occur very frequently or at all. If this is the only value used to check for inactive computer objects, then computer objects will be removed for active used Surface Hubs.</span>

<a href="https://adsecurity.org/?p=280"><span style="color: #0563c1;font-family: Calibri">https://adsecurity.org/?p=280</span></a><span style="color: #000000;font-family: Calibri"> provides some additional details into how AD treats computer objects and has some example cleanup scripts. One option to avoid deleting Hub objects is to add an operating system filter to exclude Hubs. Something like (OperatingSystem -notlike “*Team*”) would work. The Surface Hub OS is “Microsoft Windows 10 Team”. The Surface Hub does conform to the standard Windows protocol of updating the computer object password every 30 days. If you are using passwordLastSet as in the linked example, there should be no issue with Surface Hub computer objects. The problem will only occur if the cleanup script relies on last login timestamp only.</span>

<span style="color: #000000;font-family: Calibri">Some additional troubleshooting suggestions:</span>

<span style="color: #000000;font-family: Calibri">If you are unsure why computer objects are being deleted, you can remove the “delete” permission for the Surface Hub machine accounts in AD for all users and groups except SYSTEM.  Then enable auditing which will show where the delete attempts are coming from.</span>

<span style="color: #000000;font-family: Calibri">The computer object password is updated via the Netlogon process on the Surface Hub. If you export the Surface Hub logs to a USB drive you can unzip the file and verify this process. In the WindowsEventLog folder, open system.evtx, and filter for Netlogon events. You should see the event:</span>

<span style="color: #000000;font-family: Calibri">“The system successfully changed its password on the domain controller <i>DC</i>.  This event is logged when the password for the computer account is changed by the system. It is logged on the computer that changed the password.”</span>

&nbsp;]]></content:encoded>
    </item>
    <item>
      <title>The CredSSP Files: Part 1 Access Denied for Local Administrator</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/the-credssp-files-part-1-access-denied-for-local-administrator</link>
      <pubDate>Sat, 13 Dec 2014 09:21:53 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2014/12/13/the-credssp-files-part-1-access-denied-for-local-administrator/</guid>
      <description><![CDATA[PowerShell remoting is an extremely useful administration tool. To take full advantage of running...]]></description>
      <content:encoded><![CDATA[<p>PowerShell remoting is an extremely useful administration tool. To take full advantage of running PowerShell commands remotely against a SharePoint farm, you will need to enable CredSSP authentication. Most PowerShell commands require communicating with the backend SQL databases. A default remote PowerShell session does not allow you to pass your credentials along to another host (in this case SQL). CredSSP is required to use this double hop authentication and to run most SharePoint cmdlets. Usually configuring CredSSP and remote PowerShell is fairly straightforward, but I have come across a number of exceptions to that rule. Most of the documentation I found online related to PowerShell remoting for Exchange, which is configured differently and as a part of the installation. In this series I will document the various issues I have run into with CredSSP and remote PowerShell and the workarounds.</p>
<p>Part 1 Access Denied for Local Administrator</p>
<p>You have successfully configured Winrm and CredSSP on your server and enabled Credential delegation on your client. Your account is a local administrator on the target server. Normally you should be all set to start a new remote session. But in some cases you will see this:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/credssp1accessdenied.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/credssp1accessdenied.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/credssp1accessdenied.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/credssp1accessdenied.PNG" border="0" /></a></p>
<p>How can that be? Access denied for a local admin?</p>
<p>In this case the next thing to check is the output of <a title="Get-PSSessionConfiguration" href="http://technet.microsoft.com/en-us/library/hh849723.aspx">Get-PSSessionConfiguration </a>on your target server. Normally this is what you will see (the exact output will vary slightly by OS/PowerShell version):</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pssessionconfiggood.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pssessionconfiggood.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pssessionconfiggood.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pssessionconfiggood.PNG" border="0" /></a></p>
<p>If instead you see this:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pssessionconfigbad.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pssessionconfigbad.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pssessionconfigbad.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pssessionconfigbad.PNG" border="0" /></a></p>
<p>You have found the problem. Access has been disabled in the session configuration. This could be the result of<a title=" Disable-PSSessionConfiguration " href="http://technet.microsoft.com/en-us/library/hh849714.aspx"> Disable-PSSessionConfiguration </a>or manually removing permissions. To fix it you will need to re-enable access with <a title="Set-PSSessionConfiguration" href="http://technet.microsoft.com/en-us/library/hh849726.aspx">Set-PSSessionConfiguration.</a> In most cases you will run it like this:</p>
<p>Set-PSSessionConfiguration -Name &quot;microsoft.powershell&quot; -ShowSecurityDescriptorUI</p>
<p>You will need to specify a different name if you are trying to connect to a named session you have setup. This command will bring up a new window that will allow you to add the permissions to local administrators. Select &#39;Y&#39; to restart the service to make the change live.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/credssp1ui1.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/credssp1ui1.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/credssp1ui1.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/credssp1ui1.PNG" border="0" /></a></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/credssp1ui2.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/credssp1ui2.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/credssp1ui2.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/credssp1ui2.PNG" border="0" /></a></p>
<p>Now running <a title="Get-PSSessionConfiguration" href="http://technet.microsoft.com/en-us/library/hh849723.aspx">Get-PSSessionConfiguration</a> will return the default output and you will be able to connect without seeing access denied.</p>
<p></p>
<p></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 Searching for a URL</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-searching-for-a-url</link>
      <pubDate>Tue, 08 Apr 2014 12:55:00 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2014/04/08/sharepoint-2013-searching-for-a-url/</guid>
      <description><![CDATA[My colleague&nbsp;Igor Veytskin&nbsp;and I have run into a few issues when trying to search for a...]]></description>
      <content:encoded><![CDATA[<p title="Igor Veytskin">My colleague&nbsp;<a title="Igor Veytskin" href="http://searchunleashed.wordpress.com/author/iveytskin/">Igor Veytskin</a>&nbsp;and I have run into a few issues when trying to search for a document in SharePoint 2013 based on its URL. If you take a look at the Managed Properties returned in search results, you&#39;ll see where the URL is stored. It is stored in the &#39;Path&#39; managed property. The <a title="Search Query Tool" href="http://sp2013searchtool.codeplex.com/">Search Query Tool </a>is very useful see the values of managed properties that may not be displayed or returned for your results page. Here is a search for &#39;team&#39; that shows the Path managed property.</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/showpath.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/showpath.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/showpath.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/showpath.PNG" border="0" /></a></p>
<p title="Igor Veytskin">If you search on an exact url within Path, then you will find the document with that URL</p>
<p title="Igor Veytskin"></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pathfullsearch.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pathfullsearch.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pathfullsearch.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pathfullsearch.PNG" border="0" /></a></p>
<p title="Igor Veytskin">The problems arise when you would like to search for just a part of the URL within &#39;Path&#39; or search for part of the URL in the full text index. This does not work in the out of the box setup.</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pathsearch.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pathsearch.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pathsearch.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pathsearch.PNG" border="0" /></a></p>
<p title="Igor Veytskin"></p>
<p title="Igor Veytskin">This is because Path is set as &quot;Complete Matching&quot;</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/completematching.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/completematching.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/completematching.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/completematching.PNG" border="0" /></a></p>
<p title="Igor Veytskin">The reasoning for this configuration is mentioned here: <a title="Changes from SharePoint 2010 to SharePoint 2013" href="http://technet.microsoft.com/en-us/library/ff607742.aspx">Changes from SharePoint 2010 to SharePoint 2013</a></p>
<table border="1">
<tbody>
<tr>
<td><span class="LW_CollapsibleArea_Title"><span style="text-decoration:underline;"><span style="color:#0066cc;">URL Query syntax</span></span></span>
<div class="LW_CollapsibleArea_HrDiv"><span style="text-decoration:underline;"><span style="text-decoration:underline;"><span style="color:#0066cc;"></span></span></span><hr class="LW_CollapsibleArea_Hr" /><span style="text-decoration:underline;"><span style="color:#0066cc;"></span></span></div>
<div class="sectionblock">
<p><strong>Description:</strong> In FAST Search Server 2010 for SharePoint, the URL-related managed properties (such as site, or path) are tokenized as a text string, and you can query any subpart of the URL. This includes <code>STARTS-WITH</code>, <code>ENDS-WITH</code>, <code>PHRASE</code> and proximity queries on URL properties. Special characters such as &ldquo;<code>/</code>&rdquo;, &ldquo;<code>_</code>&rdquo; and &ldquo;<code>-</code>&rdquo;are handled as word delimiters.</p>
<p>In SharePoint 2013, the entire URL is tokenized as one word. This includes special characters such as &ldquo;<code>/</code>&rdquo;, &ldquo;<code>_</code>&rdquo; and &ldquo;<code>-</code>&rdquo;. You can query these managed properties by:</p>
<ul>
<li>
<p>Searching for the full string for the site or path.</p>
</li>
<li>
<p>Searching for the leading part of the site or path.</p>
</li>
<li>
<p>Omitting the protocol part (http, https), and omitting the leading part of the domain address in the query expression, for the site managed property.</p>
</li>
</ul>
<p><strong>Reason for change:</strong> The implementation in SharePoint 2013 is aligned with SharePoint Server 2010 search. The FAST Search Server 2010 for SharePoint implementation has a very high query performance cost, especially when you search for the full URL or a leading subset of the URL.</p>
<p><strong>Migration path:</strong> The following table provides details on how to change FAST Search Server 2010 for SharePoint query expressions to match the SharePoint 2013 URL query syntax.</p>
<h3 class="subHeading">&nbsp;</h3>
<table>
<tbody>
<tr><th>To match</th><th>Then</th></tr>
<tr>
<td>
<p>The complete URL string</p>
</td>
<td>
<p>Search for the exact string. Special characters in the URL must match. Do not use the <code>PHRASE</code> operator.</p>
</td>
</tr>
<tr>
<td>
<p>The leading part of the URL</p>
</td>
<td>
<p>Do not use the wildcard character.</p>
</td>
</tr>
<tr>
<td>
<p>Any part of the URL</p>
</td>
<td>
<ul>
<li>
<p>Map the relevant crawled property to an additional managed property of type text.</p>
</li>
<li>
<p>Use this managed property as a property filter in your query.</p>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
</div>
</td>
</tr>
</tbody>
</table>
<p title="Igor Veytskin"></p>
<p title="Igor Veytskin">Many customers are willing to trade off some additional space in the index and tokenization&nbsp;processing to be able to search on parts of the URL. This is how you set it up. First off, it is a&nbsp; good policy never to change the default managed properties if you can avoid it. So, we&#39;ll create a new Managed Property called &#39;newpath&#39;. You can create the property as normal using the GUI, but we&#39;ll need to handle mapping crawled properties in PowerShell. We want to use the exact same crawled property mapping that Path uses. First create the new managed property.</p>
<p title="Igor Veytskin">We will leave Complete Matching unchecked</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/nocompletematching.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/nocompletematching.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/nocompletematching.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/nocompletematching.PNG" border="0" /></a></p>
<p title="Igor Veytskin">We will also add Searchable, so we can search against the full text index.</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/searchable.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/searchable.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/searchable.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/searchable.PNG" border="0" /></a></p>
<p title="Igor Veytskin">Leave the crawled property mapping empty.</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/emptymapping.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/emptymapping.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/emptymapping.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/emptymapping.PNG" border="0" /></a></p>
<p title="Igor Veytskin">Next is the crawled property mapping. Start by getting the Path managed property and displaying the mapping.</p>
<table border="1">
<tbody>
<tr>
<td>
<p>$ssa=Get-SPEnterpriseSearchServiceApplication</p>
<p>$pathmp= Get-SPEnterpriseSearchMetadataManagedProperty -SearchApplication $ssa -Identity &quot;Path&quot;</p>
<p>$pathmp.GetMappedCrawledProperties(10)</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pathmappedcp.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pathmappedcp.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/pathmappedcp.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/pathmappedcp.PNG" border="0" /></a></p>
</td>
</tr>
</tbody>
</table>
<p title="Igor Veytskin">Now create the same mapping for newpath. We use PowerShell since that allows us to easily select the exact same propset and name that Path is mapped to.</p>
<table border="1">
<tbody>
<tr>
<td>
<p>$newpathmp= Get-SPEnterpriseSearchMetadataManagedProperty -SearchApplication $ssa -Identity &quot;newpath&quot;</p>
<p>$pathmp.GetMappedCrawledProperties(10) | ForEach-Object {<br />&nbsp; $cp = Get-SPEnterpriseSearchMetadataCrawledProperty -SearchApplication $ssa -Name $_.Name -Propset $_.propset<br />&nbsp; New-SPEnterpriseSearchMetadataMapping -SearchApplication $ssa -ManagedProperty $newpathmp -CrawledProperty $cp<br />}</p>
<p>$newpathmp.Update()</p>
</td>
</tr>
</tbody>
</table>
<p title="Igor Veytskin">Now you&#39;ll see the mapping in the GUI</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/fullmapping.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/fullmapping.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/fullmapping.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/fullmapping.PNG" border="0" /></a></p>
<p title="Igor Veytskin">After a full crawl of your content source. Testing searching on the newpath managed property:</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/newpathsearch.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/newpathsearch.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/newpathsearch.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/newpathsearch.PNG" border="0" /></a></p>
<p title="Igor Veytskin"></p>
<p title="Igor Veytskin">Testing against the default full text index with a subset of the URL. This will not work out of the box</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/4174.teamfulltextsearch.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/4174.teamfulltextsearch.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/4174.teamfulltextsearch.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/4174.teamfulltextsearch.PNG" border="0" /></a></p>
<p title="Igor Veytskin">Searching for the same subset of the url against path. This is what you&#39;ll get with an out of the box full text search.</p>
<p title="Igor Veytskin"><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/teampathsearch.PNG" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/teampathsearch.PNG"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/teampathsearch.PNG" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/teampathsearch.PNG" border="0" /></a></p>
<p title="Igor Veytskin"></p>
<p title="Igor Veytskin"></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 No Code User Segment Search</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-no-code-user-segment-search</link>
      <pubDate>Mon, 24 Mar 2014 07:37:00 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2014/03/24/sharepoint-2013-no-code-user-segment-search/</guid>
      <description><![CDATA[I stated looking into the User Segmentation feature in SharePoint 2013. The idea is that you...]]></description>
      <content:encoded><![CDATA[<p></p>
<p>I stated looking into the User Segmentation feature in SharePoint 2013. The idea is that you create query rules based off of a category of users and then change the search experience to better suit them. Some examples would be adjusting results based on the users language / location, providing different best bets based on a user&#39;s title, etc. The first step is to define the names of the segments. These are just entries in the Managed Metadata Service term store.</p>
<p>Here is an example from my test case. I just created two terms: English and French.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/usersegTermStore.png" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/usersegTermStore.png"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/usersegTermStore.png" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/usersegTermStore.png" border="0" /></a></p>
<p>This is where most examples would ask you to create a custom web part. Here are two examples I looked at: <a title="Adaptive experiences in a Product Catalog in SharePoint 2013 using Facebook location data" href="http://blogs.msdn.com/b/adaptive_experiences_in_sharepoint_2013/archive/2012/11/16/adaptive-experiences-in-a-product-catalog-in-sharepoint-2013-using-facebook-location-data.aspx">Adaptive experiences in a Product Catalog in SharePoint 2013 using Facebook location data</a>&nbsp;and <a title="User segmentation in SharePoint 2013" href="http://msdn.microsoft.com/en-us/library/office/jj870831(v=office.15).aspx">User segmentation in SharePoint 2013</a></p>
<p></p>
<p>That web part will do a few things:</p>
<p>1. Look for a property to compare against user segments.</p>
<p>2. Check the term store to see if there is a match for the property.</p>
<p>3. Grab the guid of the matching term</p>
<p>4. Add the guid to a special query&nbsp;parameter</p>
<p></p>
<p>Step 1 is not really SharePoint specific. Steps 2 and 3 are fairly straight forward. So, I wanted to focus on part 4. How can you add a user segment to your query without adding a custom&nbsp;web part? What if you are using the REST API directly?</p>
<p></p>
<p>The key is how can you specify &quot;UserSegmentTerms&quot;</p>
<p>(dataProvider.Properties[&quot;UserSegmentTerms&quot;]&nbsp;=&nbsp;userSegmentTerms.ToArray();)</p>
<p>in your query. UserSegmentTerms is not a property that you can just add as a part of the get request. UserSegmentTerms needs to be passed a part of&nbsp;<a title="KeywordQueryProperties" href="http://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.client.search.query.keywordqueryproperties(v=office.15).aspx">KeywordQueryProperties</a>.&nbsp;</p>
<p>To pass the KeywordQueryProperties, we&#39;re going to use a post request and send a JSON object. I found Nadeem&#39;s blog a great place to get started here: <a title="How-To: PostQuery in SharePoint 2013 Search REST API" href="http://blogs.msdn.com/b/nadeemis/archive/2012/10/21/how-to-postquery-in-sharepoint-2013-search-rest-api.aspx">How-To: PostQuery in SharePoint 2013 Search REST API</a> and <a title="Tip - Handling HTTP 403 Forbidden when querying the Search REST Service using the PostQuery method" href="http://blogs.msdn.com/b/nadeemis/archive/2012/10/23/tip-handling-http-403-forbidden-when-querying-the-search-rest-service-using-the-postquery-method.aspx">Tip - Handling HTTP 403 Forbidden when querying the Search REST Service using the PostQuery method</a> .</p>
<p>Once we have our basic JSON post query working, we want to specify the KeywordQueryProperties. This is done by specifying &quot;properties&quot;. There are some good examples here <a title="SharePoint Search REST API overview" href="http://msdn.microsoft.com/en-us/library/office/jj163876(v=office.15).aspx">SharePoint Search REST API overview</a> . If you scroll down to &quot;Properties&quot;, you&#39;ll see an example of how to specify the KeyworkQueryProperties.</p>
<p></p>
<table border="1">
<tbody>
<tr>
<td>{<br />&#39;__metadata&#39;:{&#39;type&#39;:&#39;Microsoft.Office.Server.Search.REST.SearchRequest&#39;},<br />&#39;Querytext&#39;:&#39;sharepoint&#39;,<br />&#39;Properties&#39; : {<br />&nbsp;&nbsp;&nbsp;&nbsp; &#39;results&#39; : [<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;Name&#39; : &#39;sampleBooleanProperty&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;Value&#39; :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;BoolVal&#39; : &#39;True&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;QueryPropertyValueTypeIndex&#39; : 3<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;Name&#39; : &#39;sampleIntProperty&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;Value&#39; : <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;IntVal&#39; : &#39;1234&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;QueryPropertyValueTypeIndex&#39; : 2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; ]<br />}<br />}</td>
</tr>
</tbody>
</table>
<p>Now, what we need to do is to create the same property that would be submitted by dataProvider.Properties[&quot;UserSegmentTerms&quot;]&nbsp;=&nbsp;userSegmentTerms.ToArray();). So, the Name will be UserSegmentTerms, the type will be a string array and the value will be a one element array with the guid of the term that defines our user segment.</p>
<p>Here is what my query look like if I want to specify the &quot;French&quot; user segment.</p>
<p></p>
<table border="1">
<tbody>
<tr>
<td>
<p>{&#39;request&#39;:<br />{<br />&#39;Querytext&#39;:&#39;sharepoint&#39;,<br />&#39;Properties&#39; : {<br />&nbsp;&nbsp;&nbsp;&nbsp; &#39;results&#39; : [<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;Name&#39; : &#39;UserSegmentTerms&#39;,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;Value&#39; :<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;StrArray&#39; :&nbsp; { &#39;results&#39; : [ &quot;3c2375ab-d09a-4f9a-9089-3ec0084192a9&quot;,&quot;3c2375ab-d09a-4f9a-9089-3ec0084192a9&quot;] } ,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;QueryPropertyValueTypeIndex&#39; : 4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; ]<br />}<br />}<br />}</p>
</td>
</tr>
</tbody>
</table>
<p>3c2375ab-d09a-4f9a-9089-3ec0084192a9&quot;,&quot;3c2375ab-d09a-4f9a-9089-3ec0084192a9 is the guid of my French term in the term store. You can see the guid in my first screen shot.</p>
<p></p>
<p>All that&#39;s left is to create Query Rules that will fire off of the user segment.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/queryrule.png" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/queryrule.png"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/queryrule.png" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/queryrule.png" border="0" /></a></p>
<p></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 Crawl Tuning Part 3: Content Processing Component continued</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-crawl-tuning-part-3-content-processing-component-continued</link>
      <pubDate>Fri, 07 Feb 2014 11:32:09 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2014/02/07/sharepoint-2013-crawl-tuning-part-3-content-processing-component-continued/</guid>
      <description><![CDATA[Picking up from part 2, we continue looking at the Content Processing Component. There were some...]]></description>
      <content:encoded><![CDATA[<p>Picking up from <a title="part 2" href="/b/peter_dempsey/archive/2014/01/30/sharepoint-2013-crawl-tuning-part-2-content-processing-component.aspx">part 2</a>, we continue looking at the Content Processing Component. There were some comments about the counters to look at and I wanted to provided a more simplified view that will be easier to understand. Instead of looking at all the flows, we&#39;ll look at just the component counter for Search Flow Statistics\Input Queue Full Time.</p>
<p></p>
<p>Baseline:</p>
<p>Looking only at the component counter, we can see it gets up to about 3,500. This is over the limit mentioned as guidance. But, that is just a rough guideline.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/simple_inputqueuefull.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/simple_5F00_inputqueuefull.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/simple_inputqueuefull.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/simple_5F00_inputqueuefull.jpg" border="0" /></a></p>
<p>With 1 additional Content Processing Component from part 2:</p>
<p>Now we see a dramatic increase in &nbsp;Search Flow Statistics\Input Queue Full Time, up to a combined 20,000. This is way over the guideline of 1,000. We shouldn&#39;t expect to gain anymore speed in our crawl by adding additional Content Processing Components at this time.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/simple_inputqueuefull2cpc.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/simple_5F00_inputqueuefull2cpc.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/simple_inputqueuefull2cpc.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/simple_5F00_inputqueuefull2cpc.jpg" border="0" /></a></p>
<p>To demonstrate further that adding another Content Processing Component wont help. I modified the topology and added a third Content Processing Component. My crawl still takes the exact same time as with only two CPCs. You can also see that the total Search Flow Statistics\Input Queue Full Time doesn&#39;t change, we are pushing more content than the indexer can keep up with.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/simple_inputqueuefull3cpc.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/simple_5F00_inputqueuefull3cpc.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/simple_inputqueuefull3cpc.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/simple_5F00_inputqueuefull3cpc.jpg" border="0" /></a></p>
<p>In part 4 we&#39;ll keep tuning to speed up the crawl.</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 Crawl Tuning Part 2: Content Processing Component</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-crawl-tuning-part-2-content-processing-component</link>
      <pubDate>Thu, 30 Jan 2014 07:26:00 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2014/01/30/sharepoint-2013-crawl-tuning-part-2-content-processing-component/</guid>
      <description><![CDATA[In part 1, we took a crawl performance baseline and came to the conclusion that our feeding...]]></description>
      <content:encoded><![CDATA[<p>In <a title="part 1" href="/b/peter_dempsey/archive/2014/01/03/sharepoint-2013-crawl-tuning-part-1-baseline.aspx">part 1</a>, we took a crawl performance baseline and came to the conclusion that our feeding bottleneck was the content processing component. So, we have expanded our SharePoint farm to two servers and we have added an additional Contend Processing Component on our new server. Our search topology now looks like this:</p>
<p></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/searchtopology2cpc.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/searchtopology2cpc.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/searchtopology2cpc.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/searchtopology2cpc.jpg" border="0" /></a></p>
<p>We&#39;ll now rerun the same full crawl test we performed in part 1 and collect counters from both servers.</p>
<p>Our transactions waiting is still increasing, so we still see that the bottleneck is&nbsp;downstream of the crawler.&nbsp;</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/transactionswaiting2cpc.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/transactionswaiting2cpc.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/transactionswaiting2cpc.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/transactionswaiting2cpc.jpg" border="0" /></a><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/inputqueuefull2cpc.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/inputqueuefull2cpc.jpg"></a></p>
<p></p>
<p>The Content Processing Component still looks like our bottleneck, but there is slightly less load now that is spread over two CPCs. Here is the Search Flow Statistics\Input Queue Full Time to compare against part 1.</p>
<p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/0842.inputqueuefull2cpc.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/0842.inputqueuefull2cpc.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/0842.inputqueuefull2cpc.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/0842.inputqueuefull2cpc.jpg" border="0" /></a></p>
<p></p>
<p>Now, the most important metric: did we improve our crawl time? By adding this single component to our search topology, we were able to cut our time for a full crawl nearly in half. Going from 85 minutes to 45 minutes. This dramatic improvement in performance shows how valuable tuning your search infrastructure can be.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/crawlperf2cpc.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/crawlperf2cpc.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/crawlperf2cpc.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/crawlperf2cpc.jpg" border="0" /></a></p>
<p>In future installments we&#39;ll take a look at what to do when other components are the bottleneck. See <a title="part 3" href="/b/peter_dempsey/archive/2014/02/07/sharepoint-2013-crawl-tuning-part-3-content-processing-component-continued.aspx">part 3</a></p>
<p></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 Crawl Tuning Part 1: Baseline</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-crawl-tuning-part-1-baseline</link>
      <pubDate>Thu, 30 Jan 2014 07:25:00 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2014/01/30/sharepoint-2013-crawl-tuning-part-1-baseline/</guid>
      <description><![CDATA[I wrote a basic overview of some of the counters needed to monitor and tune content feeding here ....]]></description>
      <content:encoded><![CDATA[<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/inputqueuefull.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/inputqueuefull.jpg"></a>I wrote a basic overview of some of the counters needed to monitor and tune content feeding <a href="/b/peter_dempsey/archive/2013/04/15/sharepoint-2013-monitor-and-tune-content-feed.aspx">here</a> . But, I thought it would be helpful to walk through a real world tuning example.&nbsp;This will&nbsp;show how the counters are really used in practice and show the performance improvements that can be gained. Tuning the content feed really is not complicated once you understand the methodology. Even though components and architecture has changed from Fast ESP, to Fast Search for SharePoint 2010, to SharePoint 2013; the process remain unchanged. First isolate the bottleneck component, then scale it up or out, and re-asses. Rinse and repeat until you reach the desired performance.</p>
<p></p>
<p>The environment I will use for testing is a single virtual machine running all of the farm components. It hosts SQL Server, all the SharePoint components, as well as a custom content enrichment web service. The content source I am crawling is a SQL database connected through BCS. The sql table has around 150,000 rows and a full crawl takes about 80 minutes. The VM has the following specs:</p>
<p></p>
<p>Ram: 16GM</p>
<p>CPU: 5 virtual cpus</p>
<p>Disk: Single VHD hosted on a local disk</p>
<p></p>
<p>The VM runs on a server that hosts other VMs and services and the disk is shared. So, like most real world environments, the hardware performance is dependent on how the resources are being shared. This is the reality for many environments and we still need to tune them.</p>
<p></p>
<p>My tuning requirements are simple: make it go faster. This is often as detailed a tuning requirement that you will get.</p>
<p></p>
<p>The first step is to capture a performance baseline, so we can compare the effects of any changes that we make. We first need to defined the counters to collect. Then we will run a full crawl and capture those counters during the crawl. It may not be possible to run a full crawl, using an incremental that picks up enough content will work fine as well. In that case you will need to track progress by looking at the throughput rate and not necessarily the crawl time.</p>
<p></p>
<p>For my baseline test, I started up a full crawl and captured counters for 10 minutes. I have attached the <a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/telligent.evolution.components.attachments/01/9231/00/00/03/61/97/79/counters.txt" original-url="http://blogs.technet.com/cfs-filesystemfile.ashx/__key/telligent-evolution-components-attachments/01-9231-00-00-03-61-97-79/counters.txt">counters.txt</a>&nbsp;file to this blog post. For the initial baseline I will used the counters and&nbsp;steps I outlined previously (<a href="/b/peter_dempsey/archive/2013/04/15/sharepoint-2013-monitor-and-tune-content-feed.aspx">SharePoint 2013 Monitor and Tune Content Feed</a>)&nbsp;There are some good details on using powershell to pull the counter&nbsp;data on <a href="/b/mark_sullivan/archive/2013/05/30/a-timesaver-run-perfmon-with-powershell.aspx">Mark Sullivan&#39;s Blog</a> . I ran the following command to capture the output as a blg:<a></a></p>
<p>get-counter -counter (get-content counters.txt) -MaxSamples 10 -sampleinterval 60 -ComputerName ksesearch | Export-counter -Force -Path perfbaseline.blg</p>
<p>Here you can see my transactions waiting backing up. More and more transaction are waiting as the crawl progresses. This Indicates an issue downstream, showing that the crawler is pushing data faster than we can handle it.</p>
<p></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/transactionswaiting.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/transactionswaiting.jpg"><img width="551" height="249" style="width:655px;height:292px;" alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/transactionswaiting.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/transactionswaiting.jpg" border="0" /></a></p>
<p></p>
<p>The next step is to look at Search Flow Statistics\Input Queue Full Time to determine if indexing or content process is the bottleneck component. You only need to be concerned about the content processing instances of this counter.</p>
<p></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/inputqueuefull.jpg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/inputqueuefull.jpg"><img alt=" " src="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/inputqueuefull.jpg" original-url="http://blogs.technet.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/inputqueuefull.jpg" border="0" /></a></p>
<p></p>
<p>Our run shows nothing over 100, which is well under the guideline of 1000. So, our next step will be to add an additional content processing component. The entire crawl took 85 minutes at a feeding rate of 29 documents per second. We&#39;ll look to improve that with the tuning. We will discuss the details in <a title="part 2" href="/b/peter_dempsey/archive/2014/01/30/sharepoint-2013-crawl-tuning-part-2-content-processing-component.aspx">part 2</a>.</p>
<p></p>
<p></p>
<p>For reference, here is the raw performance capture:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/92/31/perfbaseline.blg" original-url="http://blogs.technet.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-92-31/perfbaseline.blg">perfbaseline.blg</a></p>
<p></p>
<p></p>
<p><a href="https://msdnshared.blob.core.windows.net/media/TNBlogsFS/prod.evol.blogs.technet.com/telligent.evolution.components.attachments/01/9231/00/00/03/61/97/79/counters.txt" original-url="http://blogs.technet.com/cfs-filesystemfile.ashx/__key/telligent-evolution-components-attachments/01-9231-00-00-03-61-97-79/counters.txt">counters.txt</a></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 Content Enrichment: Regular Expression Data Extraction</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-content-enrichment-regular-expression-data-extraction</link>
      <pubDate>Wed, 04 Dec 2013 11:50:00 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2013/12/04/sharepoint-2013-content-enrichment-regular-expression-data-extraction/</guid>
      <description><![CDATA[There are a number of posts on getting started writing a Content Enrichment Web Service. I found...]]></description>
      <content:encoded><![CDATA[<p>There are a number of posts on getting started writing a Content Enrichment Web Service. I found <a href="http://msdn.microsoft.com/en-us/library/office/jj163982.aspx">http://msdn.microsoft.com/en-us/library/office/jj163982.aspx</a> a great starting point. I recently needed to write a CEWS application to extract regex patterns from a managed property. I thought I would share this as template.</p>
<p>&nbsp;</p>
<p>Define InProperty to be the name of the managed property you would like to extract from and OutProperty to be the Managed property that will hold the extracted data.</p>
<p>&nbsp;</p>
<p>using <span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">System;</span></span></p>
<p>using <span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">System.Collections.Generic;</span></span></p>
<p>using&nbsp;<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">System.IO;</span></span></p>
<p>using <span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">Microsoft.Office.Server.Search.ContentProcessingEnrichment;</span></span></p>
<p>using <span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">Microsoft.Office.Server.Search.ContentProcessingEnrichment.PropertyTypes;</span></span></p>
<p>using <span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">System.Text.RegularExpressions;</span></span></p>
<p>&nbsp;</p>
<p>namespace <span style="font-size: x-small;">RegEx</span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">ContentProcessingEnrichmentService</span></span></p>
<p>{</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">public </span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">class </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">RegExContentProcessingEnrichmentService</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> : </span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">IContentProcessingEnrichmentService</span></span></span></p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;<span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;">// Defines the error code for managed properties with an unexpected type.</span></span></span>&nbsp;</p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">private</span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">const</span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">int</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> UnexpectedType = 1;</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;">// Defines the error code for encountering unexpected exceptions.</span></span></span></p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">private</span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">const</span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">int</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> UnexpectedError = 2;</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: x-small; background-color: #ffffff;">//&nbsp; out is the managed property we will write the extracted data to&nbsp;</span></p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">private </span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">const </span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">string</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> OutProperty = </span></span><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;">"out"</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">;</span></span></p>
<p><span style="color: #339966; font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">//&nbsp; in contains the text we will match our pattern against</span></span></p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">private </span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">const </span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">string</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> InProperty = </span></span><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;">"in"</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">;</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">private </span></span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">readonly </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">ProcessedItem</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> processedItemHolder = </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">new </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">ProcessedItem</span></span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ItemProperties = <span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">new </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">List</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&lt;</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">AbstractProperty</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&gt;()</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">public </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">ProcessedItem</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> ProcessItem(</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Item</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> item)</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processedItemHolder.ErrorCode = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processedItemHolder.ItemProperties.Clear();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try</span></span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // placeholder for output. </span></span></span></p>
<p><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We have defined the Managed Property as multi-valued, so we want to output a list</span></span></span></p>
<p><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&lt;</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">List</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&lt;</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">String</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&gt;&gt; output =<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">new </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Property</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&lt;</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">List</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&lt;</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">String</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&gt;&gt;();</span></span></span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: x-small;"> // store the input string</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">String</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> input=</span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">null</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">;</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966; font-size: x-small;"> // loop through each property</span></p>
<p><span style="color: #339966; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;<a href="http://blogs.msdn.com/b/richard_dizeregas_blog/archive/2013/06/19/advanced-content-enrichment-in-sharepoint-2013-search.aspx"><span style="color: #339966;">http://blogs.msdn.com/b/richard_dizeregas_blog/archive/2013/06/19/advanced-content-enrichment-in-sharepoint-2013-search.aspx</span></a> </span></p>
<p><span style="color: #339966; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// presents a more elegant method of selecting the desired properties</span></p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (</span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">var</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> property </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">in</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> item.ItemProperties)</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;"><span style="color: #008000; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Check if this is the input property.</span></span></span></p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (property.Name.Equals(InProperty, </span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">StringComparison</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">.Ordinal))</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966; font-size: x-small;">&nbsp; // I had some issues getting the value via the example method. This seems to work fine</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input= (<span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">String</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">)property.ObjectValue; </span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (input!= </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">null</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">)</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966; font-size: x-small;"> // regex to find in the input</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">string</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> pattern = </span></span><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;"><span style="color: #a31515; font-family: Consolas; font-size: x-small;">"Value=\"([^\"]*)\""</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">; </span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">MatchCollection</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> matches = </span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Regex</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">.Matches(input, pattern, </span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">RegexOptions</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">.Singleline);</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #339966; font-size: x-small;">// initialize the output</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.Value = <span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">new </span></span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">List</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&lt;</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">String</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">&gt;();</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.Name = OutProperty;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">foreach</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Match</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> match </span></span><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">in</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> matches)</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966; font-size: x-small;">// add the value of the matching group to the output managed property</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.Value.Add(match.Groups[1].Value);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processedItemHolder.ItemProperties.Add(output);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">catch</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> (</span></span><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;"><span style="color: #2b91af; font-family: Consolas; font-size: x-small;">Exception</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">)</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processedItemHolder.ErrorCode = UnexpectedError;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;"><span style="color: #0000ff; font-family: Consolas; font-size: x-small;">return</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> processedItemHolder;</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 Monitor and Tune Content Feed</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-monitor-and-tune-content-feed</link>
      <pubDate>Mon, 15 Apr 2013 05:12:00 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2013/04/15/sharepoint-2013-monitor-and-tune-content-feed/</guid>
      <description><![CDATA[I have not seen too much in the way of guidance for monitoring and tuning content feeding for...]]></description>
      <content:encoded><![CDATA[<p>I have not seen too much in the way of guidance for monitoring and tuning content feeding for SharePoint 2013. This post will cover isolating the bottleneck in your&nbsp;feeding chain.&nbsp;In a future post, I&nbsp;will cover how to address these bottlenecks. But, in&nbsp;most cases you will simply need to add more instances of a component or hardware resources.&nbsp;If you are familiar with the content feed monitoring and tuning process for Fast Search for SharePoint 2010, the process is basically the same for SP2013. This article is starting for monitoring the performance of content feeding in SharePoint 2013. The focus is on the SharePoint 2013 counters; as guidance for system level counters is already provided elsewhere.</p>
<p>Note: some of the thresholds are a rough estimate and may be replaced by more formal product documentation or field experience&nbsp;in the future.</p>
<p>&nbsp;</p>
<p>The main components in the feeding chain&nbsp;are:</p>
<ul>
<li>
<p>Crawl Database</p>
</li>
<li>
<p>Crawl Component</p>
</li>
<li>
<p>Content Processing Component</p>
</li>
<li>
<p>Index Component</p>
</li>
</ul>
<p>Here are some useful counters to monitor for each component.</p>
<table border="1" cellspacing="2" cellpadding="2">
<tbody>
<tr>
<td>Component</td>
<td>Key Hardware Resource</td>
<td>Counters</td>
</tr>
<tr>
<td>Crawl Database</td>
<td>Disk I/O</td>
<td>Logical Disk\*</td>
</tr>
<tr>
<td>Crawl Component</td>
<td>Processor&nbsp;</td>
<td>
<p>Search Gatherer Projects -<br />SharePointServerSearch\Transactions Waiting</p>
<p>Search Gatherer Projects -<br />SharePointServerSearch\Transactions In Progress</p>
<p>Search Gatherer Projects -<br />SharePointServerSearch\Transactions Completed</p>
<p>Search Gatherer - SharePointServerSearch\Threads<br />Accessing Network</p>
<p>Search Gatherer -<br />SharePointServerSearch\Threads Filtering</p>
<p>Search Gatherer -<br />SharePointServerSearch\Threads Idle</p>
</td>
</tr>
<tr>
<td>Content Processing Component</td>
<td>Processor&nbsp;</td>
<td>
<p>Search Submission Service\# Pending Items</p>
<p>Search Flow Statistics\# Items Queued For<br />Processing</p>
<p>Search Flow Statistics\Input Queue Empty Time</p>
<p>Search Flow Statistics\Input Queue Full Time</p>
</td>
</tr>
<tr>
<td>Index Component&nbsp;</td>
<td>Disk I/O</td>
<td>Logical Disk\*</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>When we begin content tuning we need to isolate the bottleneck in the feeding chain. I find it useful to approach this as a two step process. First we want to determine if the bottleneck occurs prior to the search subsystem (Upstream) or after hitting the search subsystem (Downstream). You could also look at these two pieces as content acquisition and content processing.</p>
<p>Content Acquisition consists of:</p>
<ul>
<li>Content Source (SharePoint site, web site, BCS connection, etc)</li>
<li>
<p>Crawl Component&nbsp;</p>
</li>
<li>
<p>Crawl Database</p>
</li>
</ul>
<p>&nbsp;</p>
<p>Content Processing consists of:</p>
<ul>
<li>
<p>Content Processing Component</p>
</li>
<li>
<p>Index Component</p>
</li>
</ul>
<p>&nbsp;</p>
<p>A good first counter to look at is <strong>Search Gatherer Projects - SharePointServerSearch\Transactions Waiting</strong> for all of the Crawl Components. If this counter is low (less than&nbsp;a few thousand), content processing is keeping up with content acquisition. If the counter is high and/or consistently rising, then we are pushing more data than Content Processing can keep up with. This is also visable in the Crawl Health report by viewing the queue length.</p>
<p>In the case where Content Processing is slow, we have two possibilities: the Content Processing Components are the bottleneck or the Index Components are the bottleneck. Both <strong>Search Submission Service\# Pending Items</strong> and <strong>Search Flow Statistics\# Items Queued For Processing</strong> will be high (greater than a few hundred).</p>
<ol>
<li>If Content Processing Components are the bottleneck</li>
<ol>
<li>
<p>Processor utilization will be high on servers running&nbsp;Content Processing Components</p>
</li>
<li>
<p><strong>Search Flow Statistics\Input Queue Full Time</strong> will be low (less than&nbsp;about 1000)</p>
</li>
</ol>
<li>
<p style="text-align: left;">If Index Components are the bottleneck</p>
</li>
<ol>
<li>
<p style="text-align: left;">There will be high disk I/O and/or latency on servers running Index Components</p>
</li>
<li>
<p style="text-align: left;"><strong>&nbsp;Search Flow Statistics\Input Queue Full Time</strong> will be high (greater than about 1000)</p>
</li>
</ol></ol>
<p style="text-align: left;">When Content Acquisition is slow, there are three possible bottlenecks: Content Source, Crawl Database, Crawl Component</p>
<ol>
<li>
<p>&nbsp;If Crawl Database is the bottleneck</p>
</li>
<ol>
<li>
<p><strong>Search Gatherer Projects - SharePointServerSearch\Transactions Completed</strong> will be high (greater than a few hundred)</p>
</li>
<li>
<p>There will be high disk queue length / disk latency&nbsp;on Crawl DB</p>
</li>
</ol>
<li>
<p>If Crawl Component is the bottleneck (not common)</p>
</li>
<ol>
<li>
<p>There will be high processor utilization on Crawl Component servers</p>
</li>
<li>
<p>There will be no&nbsp;disk latency issue on Crawl DB</p>
</li>
</ol>
<li>
<p>If Content Source is the bottleneck</p>
</li>
<ol>
<li>
<p><strong>Search Gatherer - SharePointServerSearch\Threads Accessing Network</strong> will be close to <strong>Search Gatherer - SharePointServerSearch\Threads Filtering</strong></p>
</li>
<li>
<p>There&nbsp;will be low processor utilization on Crawl Component servers</p>
</li>
<li>
<p>There&nbsp;will be&nbsp;no&nbsp;disk&nbsp;latency&nbsp;issues&nbsp;on Crawl DB</p>
</li>
</ol></ol>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint 2013 Unable to change topology when Generation controller is not active</title>
      <link>https://docs.microsoft.com/archive/blogs/peter_dempsey/sharepoint-2013-unable-to-change-topology-when-generation-controller-is-not-active</link>
      <pubDate>Thu, 11 Apr 2013 06:41:00 GMT</pubDate>
      <dc:creator><![CDATA[Peter Dempsey]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/peter_dempsey/2013/04/11/sharepoint-2013-unable-to-change-topology-when-generation-controller-is-not-active/</guid>
      <description><![CDATA[When making a change to the search topology, you need to have at least one index component in the...]]></description>
      <content:encoded><![CDATA[<p>When making a change to the search topology, you need to have at least one index component in the active state with no warnings for each partition. This makes sense if you are adding additional partitions which would cause the indexed documents to be repartitioned. In that case you would need a valid copy of every document in the index to redistribute. Or, if you add additional replicas, you need a source to populate that replica with indexed documents. Unfortunately the constraint of having an indexer controller up in each partition applies to all topology changes. For examples, you could not add an additional admin component if one of you partitions is down.</p>
<p>Here is the error you'll see if you try to activate an new topology in this state:</p>
<p>&nbsp;</p>
<p>PS C:\Users\SPFarm&gt; Set-SPEnterpriseSearchTopology -Identity $newTopology<br />Set-SPEnterpriseSearchTopology : Topology activation failed. Management called failed with System.InvalidOperationException: 'Unable to change topology when Generation controller is not active' at&nbsp;&nbsp;&nbsp; at Microsoft.Ceres.SearchCore.IndexController.IndexController.IsEmptyIndex(String indexSystemName)<br />&nbsp;&nbsp; at Microsoft.Ceres.SearchCore.IndexController.IndexControllerManagementAgent.WrapCall[T](Func`2 original)<br />At line:1 char:1<br />+ Set-SPEnterpriseSearchTopology -Identity $newTopology<br />+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />&nbsp;&nbsp;&nbsp; + CategoryInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : InvalidData: (Microsoft.Offic...tSearchTopology:SetSearchTopology) [Set-SPEnterpriseSearchTopology], SearchTopologyActivationException<br />&nbsp;&nbsp;&nbsp; + FullyQualifiedErrorId : Microsoft.Office.Server.Search.Cmdlet.SetSearchTopology</p>
<p>&nbsp;</p>
<p>This is current as of the March 2013 Public Update. This appears to be yet another reason to assure your active topology is fault-tolerant and not to rely on adding additional components in the event of a failure.</p>]]></content:encoded>
    </item>
  </channel>
</rss>