Skip to content

Instantly share code, notes, and snippets.

@hishaamn
Created August 17, 2024 19:38
Show Gist options
  • Save hishaamn/91c62a4b50d02434cbe46d47c8f3af37 to your computer and use it in GitHub Desktop.
Save hishaamn/91c62a4b50d02434cbe46d47c8f3af37 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
using Sitecore.ContentSearch.SolrProvider.Pipelines.PopulateSolrSchema;
using SolrNet.Schema;
public class ExtSchemaPopulateHelper : SchemaPopulateHelper
{
private readonly SolrSchema schema;
public ExtSchemaPopulateHelper(SolrSchema solrSchema) : base(solrSchema) => this.schema = solrSchema;
public override IEnumerable<XElement> GetAllFieldTypes() => this.GetReplaceFields().Union(this.GetAddFieldTypes()).Where(o => o != null);
private IEnumerable<XElement> GetAddFieldTypes()
{
var schemaPopulateHelper = this;
yield return schemaPopulateHelper.CreateFieldType("random", "solr.RandomSortField", new Dictionary<string, string>()
{
{
"indexed",
"true"
}
});
yield return schemaPopulateHelper.CreateFieldType("ignored", "solr.StrField", new Dictionary<string, string>()
{
{
"indexed",
"false"
},
{
"stored",
"false"
},
{
"docValues",
"false"
},
{
"multiValued",
"true"
}
});
}
private XElement CreateFieldType(string name, string @class, IDictionary<string, string> properties)
{
var xelement = new XElement(this.TypeExists(name) ? "replace-field-type" : "add-field-type");
xelement.Add(new XElement(nameof(name), name));
xelement.Add(new XElement(nameof(@class), @class));
foreach (var property in properties)
{
xelement.Add(new XElement(property.Key, property.Value));
}
return xelement;
}
private XElement GetReplaceTextGeneralFieldType()
{
SolrFieldType solrFieldType = this.schema.SolrFieldTypes.Find((Predicate<SolrFieldType>)(f => f.Name == "text_general"));
if (solrFieldType == null)
{
return (XElement)null;
}
XElement generalFieldType = new XElement((XName)"replace-field-type");
generalFieldType.Add(new XElement((XName)"name", solrFieldType.Name));
generalFieldType.Add(new XElement((XName)"class", solrFieldType.Type));
generalFieldType.Add(new XElement((XName)"positionIncrementGap", "100"));
generalFieldType.Add(new XElement((XName)"multiValued", "false"));
XElement content1 = new XElement((XName)"indexAnalyzer");
content1.Add(new XElement((XName)"tokenizer", new XElement((XName)"class", "solr.StandardTokenizerFactory")));
content1.Add(new XElement((XName)"filters", new object[3]
{
new XElement((XName) "class", "solr.StopFilterFactory"),
new XElement((XName) "ignoreCase", "true"),
new XElement((XName) "words", "stopwords.txt")
}));
content1.Add(new XElement((XName)"filters", new XElement((XName)"class", "solr.LowerCaseFilterFactory")));
content1.Add(new XElement((XName)"filters", new object[2]
{
new XElement((XName) "class", "solr.ASCIIFoldingFilterFactory"),
new XElement((XName) "preserveOriginal", "true"),
}));
content1.Add(new XElement((XName)"charFilters", new object[2]
{
new XElement((XName) "class", "solr.MappingCharFilterFactory"),
new XElement((XName) "mapping", "mapping-FoldToASCII.txt"),
}));
content1.Add(new XElement((XName)"charFilters", new object[2]
{
new XElement((XName) "class", "solr.MappingCharFilterFactory"),
new XElement((XName) "mapping", "mapping-FoldToASCII.txt"),
}));
generalFieldType.Add(content1);
XElement content2 = new XElement((XName)"queryAnalyzer");
content2.Add(new XElement((XName)"tokenizer", new XElement((XName)"class", "solr.StandardTokenizerFactory")));
content2.Add(new XElement((XName)"filters", new object[3]
{
new XElement((XName) "class", "solr.StopFilterFactory"),
new XElement((XName) "ignoreCase", "true"),
new XElement((XName) "words", "stopwords.txt")
}));
content2.Add(new XElement((XName)"filters", new object[4]
{
new XElement((XName) "class", "solr.SynonymFilterFactory"),
new XElement((XName) "synonyms", "synonyms.txt"),
new XElement((XName) "ignoreCase", "true"),
new XElement((XName) "expand", "true")
}));
content2.Add(new XElement((XName)"filters", new XElement((XName)"class", "solr.LowerCaseFilterFactory")));
generalFieldType.Add(content2);
return generalFieldType;
}
private IEnumerable<XElement> GetReplaceFields()
{
yield return this.GetReplaceTextGeneralFieldType();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment