In this article we can explore an Advanced Search feature of SharePoint 2013.
Content Enrichment Web Service
SharePoint 2013 allows developers to add a custom step between content processing. A SharePoint content source crawl will call our custom web service. We can create or change the metadata properties associated with the crawl item.
Under the hood, the web service is actually implementing a pre-defined interface. Each crawl item will be passed to the interface method where the item URL and properties can be accessed.
Scenarios
We can use a Content Enrichment Web Service for the following scenarios:
- You have multiple web content sources configured. You need to create new Managed Properties based on each URL. Example: Blog, Website and so on.
- You have a content source with limited metadata information. You need to add a new Managed Properties based on the content.
- You have a content source with metadata information. You need to correct the Managed Properties.
- You have a SharePoint list where an Age column exists. You need to classify the content as Minor and Major using Managed Properties.
Infrastructure
The following is the Infrastructure needed:
- Visual Studio 2012
- IIS website to host the service
- WCF service
Practical
To perform the Practical, we need to set up the following.
- SharePoint 2013 Enterprise site
- Create Enterprise Search Center site
- Central Administration > Search > Create Content Source > Add jeanpaulva
- Central Administration > Search > Create Content Source > Add sharepointcto
- Central Administration > Create Crawl Rules > Include query strings (?) for both URLs
- Server > IE Enhanced Security Configuration > Off
- Perform Full Crawl for both content sources
After the preceding steps, try searching for sharepointcto from the Enterprise Search Center site and you should be able to see results from both the URLs as shown below.
Our purpose is to provide
refiners as in the following.
Steps
Step 1: Create ServiceCreate a new WCF service application project.
Delete the existing Service files and create a new Service.
You can delete the interface file as well. The Solution Explorer looks as in the following.
Add Reference to the following assembly:
15HIVE\Search\Applications\External\Microsoft.Office.Server.Search.ContentProcessingEnrichment.dll
Step 2: Implement Interface
Open the SVC file and implement a pre-defined interface IContentProcessingEnrichmentService as shown below.
The only method named
ProcessItem passes an
Item argument and returns a
ProcessedItem argument.
The interface IContentProcessingEnrichmentService belongs to the ContentProcessingEnrichment assembly.
The Item type has a property named ItemProperties that contains pre-defined Name-Value pairs of:
ContentType |
Access the Content Type of the item |
Name |
Access the Name of the item |
Title |
Access the Title of the item |
Path |
Access the Path of the item |
ContentSource |
Access the ContentSource name |
We can specify the input and output properties when registering the service. In our case we are using the Path property.
Step 3: Create Method
Replace the method with the following code. Right-click and Resolve type name errors.
public ProcessedItem ProcessItem(Item item)
{
ProcessedItem processedItem = new ProcessedItem();
processedItem.ItemProperties = new List<AbstractProperty>();
var p = item.ItemProperties.Where(n => n.Name == "Path").First();
string url = p.ObjectValue.ToString();
if (!string.IsNullOrEmpty(url))
if (url.StartsWith("http://www.sharepointcto.com"))
{
Property<string> property = new Property<string>()
{
Name = "WebType",
Value = "Site"
};
processedItem.ItemProperties.Add(property);
}
else if (url.StartsWith("http://www.jeanpaulva.com"))
{
Property<string> property = new Property<string>()
{
Name = "WebType",
Value = "Blog"
};
processedItem.ItemProperties.Add(property);
}
return processedItem;
}
The preceding code performs the following:
- Get the Path property value
- If the Path value is of www.sharepointcto.com then create a Managed Property WebType and set the value to Site
- If a Path value is of www.jeanpaulva.com then create a Managed Property WebType and set the value to Blog
- The processedItem object will be returned by the method
Step 4: Run the Service
Save and Run the Service.
Step 5: Create Managed Property
Open Central Administration > Service Applications > Search Service Application > Search Schema > New Managed Property page. Enter the following details.
- Name as WebType
- Type as Text
- Searchable enable
- Queryable enable
- Refinable yes-active
Step 6: Register Service using PowerShell
Open the PowerShell ISE editor and copy and paste the following code.
if ((Get-PSSnapin "Microsoft.SharePoint.PowerShell" -ErrorAction SilentlyContinue) -eq $null)
{
Add-PSSnapin "Microsoft.SharePoint.PowerShell"
}
# Get SearchServiceApplication
$ssa = Get-SPEnterpriseSearchServiceApplication
Remove-SPEnterpriseSearchContentEnrichmentConfiguration –SearchApplication $ssa
$c = New-SPEnterpriseSearchContentEnrichmentConfiguration
$c.Endpoint = "http://localhost:52156/WebsiteEnrichmentService.svc"
$c.DebugMode = $false
$c.SendRawData = $false
$c.InputProperties = "Path"
$c.OutputProperties = "WebType"
Set-SPEnterpriseSearchContentEnrichmentConfiguration –SearchApplication $ssa –ContentEnrichmentConfiguration $c
Please remember to use the correct URL for the service.
Save and Run. If no errors, your service is installed successfully.
Step 7: Perform Full Crawl
Open Central Administration and Perform a Full Crawl for the following content sources.
- Web content source for sharepointcto
- Web content source for jeanpaulva
Step 8: Add Refiners to the Result Page
Open the Enterprise Search Center result page, bring the page to edit mode, edit the refiner web part and add the WebType refiner. You can view the References section on how to add Search Refiners.
Step 9: Test Search
Open the Enterprise Search Center Site and try searching for content. You can see the Web Type refiner appearing and try clicking on the values.
If the result is filtered based on Blog or Site values then it means the Refiners are working correctly.
Since the Content Enrichment Web Service will be called for all the Content Sources, performance can become sluggish since there is a delay involved in the service invocation. It is recommended that we deploy the service closer to the SharePoint system. Alternatively, one can try Asynchronous mode too.
We can also debug the service. Ensure the Service is running and set breakpoints.
References
Summary
In this article we have explored Content Enrichment Web Service. The source code and script is attached for download.