Skip to content

Commit

Permalink
Enhanced multifield crawling
Browse files Browse the repository at this point in the history
  • Loading branch information
alexshyba committed May 5, 2013
1 parent 5964598 commit a081b2c
Show file tree
Hide file tree
Showing 8 changed files with 149 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@
<fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.DateFieldCrawler,scSearchContrib.Crawler" fieldType="Datetime" />
<fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.DateFieldCrawler,scSearchContrib.Crawler" fieldType="Date" />
<fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.NumberFieldCrawler,scSearchContrib.Crawler" fieldType="Number" />
<fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="Multilist" />
<fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="Treelist" />
<fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="TreelistEx" />
<fieldCrawler type="scSearchContrib.Crawler.FieldCrawlers.MultilistFieldCrawler,scSearchContrib.Crawler" fieldType="Checklist" />
</fieldCrawlers>

<!-- DYNAMIC FIELDS
Expand All @@ -93,13 +97,6 @@
<fieldType name="rich text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="memo" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="text" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<!-- Multilist based fields need to be tokenized to support search of multiple values -->
<fieldType name="multilist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="treelist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="treelistex" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<fieldType name="checklist" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
<!-- Legacy tree list field from ver. 5.3 -->
<fieldType name="tree list" storageType="NO" indexType="TOKENIZED" vectorType="NO" boost="1f" />
</fieldTypes>
</demo>
</crawlers>
Expand Down
14 changes: 12 additions & 2 deletions scSearchContrib.Crawler/Crawlers/AdvancedDatabaseCrawler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,19 @@ protected override void AddAllFields(Document document, Item item, bool versionS

protected virtual void ProcessField(SCField field, Document document)
{
var value = ExtendedFieldCrawlerFactory.GetFieldCrawlerValue(field, FieldCrawlers);
var values = ExtendedFieldCrawlerFactory.GetFieldCrawlerValues(field, FieldCrawlers);
foreach (var value in values)
{
ProcessFieldValue(field, document, value);
}
}

if (string.IsNullOrEmpty(value)) return;
protected virtual void ProcessFieldValue(SCField field, Document document, string value)
{
if (string.IsNullOrEmpty(value))
{
return;
}

var indexType = GetIndexType(field);
var storageType = GetStorageType(field);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,36 +1,56 @@
using System;
using System.Collections.Generic;
using Sitecore.Collections;
using Sitecore.Data.Fields;
using Sitecore.Diagnostics;
using Sitecore.Reflection;
using Sitecore.Search.Crawlers.FieldCrawlers;

namespace scSearchContrib.Crawler.FieldCrawlers
namespace scSearchContrib.Crawler.FieldCrawlers
{
public class ExtendedFieldCrawlerFactory
{
public static string GetFieldCrawlerValue(Field field, SafeDictionary<string, string> fieldCrawlers)
{
Assert.IsNotNull(field, "Field was not supplied");
Assert.IsNotNull(fieldCrawlers, "Field Crawler collection is not specified");
using System.Collections.Generic;

using Sitecore.Collections;
using Sitecore.Data.Fields;
using Sitecore.Diagnostics;
using Sitecore.Reflection;
using Sitecore.Search.Crawlers.FieldCrawlers;

if (fieldCrawlers.ContainsKey(field.TypeKey))
{
var fieldCrawlerType = fieldCrawlers[field.TypeKey];
/// <summary>
/// The extended field crawler factory.
/// </summary>
public class ExtendedFieldCrawlerFactory
{
/// <summary>
/// The get field crawler values.
/// </summary>
/// <param name="field">
/// The field.
/// </param>
/// <param name="fieldCrawlers">
/// The field crawlers.
/// </param>
/// <returns>
/// The IEnumerable of field crawler values.
/// </returns>
public static IEnumerable<string> GetFieldCrawlerValues(Field field, SafeDictionary<string, string> fieldCrawlers)
{
Assert.IsNotNull(field, "Field was not supplied");
Assert.IsNotNull(fieldCrawlers, "Field Crawler collection is not specified");

if (!String.IsNullOrEmpty(fieldCrawlerType))
if (fieldCrawlers.ContainsKey(field.TypeKey))
{
var fieldCrawler = ReflectionUtil.CreateObject(fieldCrawlerType, new object[] {field});
var fieldCrawlerType = fieldCrawlers[field.TypeKey];

if (!string.IsNullOrEmpty(fieldCrawlerType))
{
var fieldCrawler = ReflectionUtil.CreateObject(fieldCrawlerType, new object[] { field });

if (fieldCrawler is IMultivaluedFieldCrawler)
{
return (fieldCrawler as IMultivaluedFieldCrawler).GetValues();
}

if (fieldCrawler != null && fieldCrawler is FieldCrawlerBase)
{
return (fieldCrawler as FieldCrawlerBase).GetValue();
}
if (fieldCrawler is FieldCrawlerBase)
{
return new[] { (fieldCrawler as FieldCrawlerBase).GetValue() };
}
}
}
}

return new DefaultFieldCrawler(field).GetValue();
}
}
return new[] { new DefaultFieldCrawler(field).GetValue() };
}
}
}
18 changes: 18 additions & 0 deletions scSearchContrib.Crawler/FieldCrawlers/IMultivaluedFieldCrawler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
namespace scSearchContrib.Crawler.FieldCrawlers
{
using System.Collections.Generic;

/// <summary>
/// The MultivaluedFieldCrawler interface.
/// </summary>
public interface IMultivaluedFieldCrawler
{
/// <summary>
/// The get values.
/// </summary>
/// <returns>
/// The IEnumerable of values.
/// </returns>
IEnumerable<string> GetValues();
}
}
44 changes: 44 additions & 0 deletions scSearchContrib.Crawler/FieldCrawlers/MultilistFieldCrawler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
namespace scSearchContrib.Crawler.FieldCrawlers
{
using System.Collections.Generic;
using System.Linq;

using scSearchContrib.Searcher.Utilities;

using Sitecore.Data.Fields;
using Sitecore.Search.Crawlers.FieldCrawlers;

/// <summary>
/// The crawler for multilist fields.
/// </summary>
public class MultilistFieldCrawler : FieldCrawlerBase, IMultivaluedFieldCrawler
{
/// <summary>
/// Initializes a new instance of the <see cref="MultilistFieldCrawler"/> class.
/// </summary>
/// <param name="field">
/// The field.
/// </param>
public MultilistFieldCrawler(Field field)
: base(field)
{
}

/// <summary>
/// The get values.
/// </summary>
/// <returns>
/// The IEnumberable of values
/// </returns>
public IEnumerable<string> GetValues()
{
if (FieldTypeManager.GetField(_field) is MultilistField)
{
MultilistField field = _field;
return field.TargetIDs.Select(IdHelper.NormalizeGuid);
}

return new string[0];
}
}
}
2 changes: 2 additions & 0 deletions scSearchContrib.Crawler/scSearchContrib.Crawler.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@
<Compile Include="Crawlers\AdvancedDatabaseCrawler.cs" />
<Compile Include="DynamicFields\AllTemplatesField.cs" />
<Compile Include="DynamicFields\BaseDynamicField.cs" />
<Compile Include="FieldCrawlers\IMultivaluedFieldCrawler.cs" />
<Compile Include="FieldCrawlers\MultilistFieldCrawler.cs" />
<Compile Include="SearchField.cs" />
<Compile Include="FieldCrawlers\DefaultFieldCrawler.cs" />
<Compile Include="FieldCrawlers\LookupFieldCrawler.cs" />
Expand Down
23 changes: 20 additions & 3 deletions scSearchContrib.Searcher/SkinnyItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ public string Name
{
get
{
return this.Fields[BuiltinFields.Name];
return this[BuiltinFields.Name];
}
}

Expand Down Expand Up @@ -130,7 +130,7 @@ public string TemplateName
{
get
{
return this.Fields[SearchFieldIDs.TemplateName];
return this[SearchFieldIDs.TemplateName];
}
}

Expand All @@ -141,7 +141,24 @@ public string Path
{
get
{
return this.Fields[SearchFieldIDs.FullContentPath];
return this[SearchFieldIDs.FullContentPath];
}
}

/// <summary>
/// The this.
/// </summary>
/// <param name="field">
/// The field.
/// </param>
/// <returns>
/// The <see cref="string"/>.
/// </returns>
public string this[string field]
{
get
{
return this.Fields[field];
}
}

Expand Down
2 changes: 1 addition & 1 deletion scSearchContrib.Searcher/Utilities/SearchHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public static void GetItemsFromSearchResult(IEnumerable<SearchResult> searchResu

foreach (Field field in result.Document.GetFields())
{
itemInfo.Fields[field.Name()] = field.StringValue();
itemInfo.Fields.Add(field.Name(), field.StringValue());
}

items.Add(itemInfo);
Expand Down

0 comments on commit a081b2c

Please sign in to comment.