public static SearchIndex <TType> Build <TType>(IEnumerable <TType> source, SearchIndexOptions <TType> options) { if (!options.Properties.Any()) { throw new Exception($"No properties specified to index"); } var wordFrequency = new Dictionary <string, int>(); var index = new SearchIndex <TType> { Options = options, Source = source.Select(c => IndexItem(c, options, wordFrequency)).ToList() }; // Index the top 1% of common words to give low scores too var possibleCommonWords = wordFrequency.Where(w => w.Value > 2); index.CommonWords = possibleCommonWords.OrderByDescending(c => c.Value).Take(possibleCommonWords.Count() / 100).Select(w => w.Key).ToArray(); return(index); }
private static SearchItem <TType> IndexItem <TType>(TType item, SearchIndexOptions <TType> options, Dictionary <string, int> wordFrequency) { var index = new SearchItem <TType>(item); foreach (var property in options.Properties) { var propertyValues = property.Value.Func.Invoke(item)?.Split(' ').Select(x => x.Clean()); if (propertyValues == null || !propertyValues.Any()) { continue; } foreach (var word in propertyValues) { if (word.Length > 2) { if (wordFrequency.ContainsKey(word)) { wordFrequency[word]++; } else { wordFrequency.Add(word, 1); } } } var propertyIndexValue = string.Join(options.IndexSeperator, propertyValues); if (!string.IsNullOrEmpty(propertyIndexValue)) { index.Index += $"{options.IndexSeperator}{propertyIndexValue}{options.IndexSeperator}"; index.PropertyIndexMap.Add(property.Key, index.Index.Length - 1); } } return(index); }
public static SearchIndex <TType> Build <TType>(IEnumerable <TType> source) { var options = new SearchIndexOptions <TType>(); return(Build(source, options)); }
public static SearchIndex <TType> ReBuild <TType>(SearchIndex <TType> original, ObservableCollection <TType> source, SearchIndexOptions <TType> options) { return(original); }