Я пытаюсь добиться сверхбыстрого поиска и решил сильно полагаться на кэширование для достижения этой цели.Порядок событий следующий:
1) Кэширование того, что может быть кэшировано (из всей базы данных, около 3000 элементов)
2) Когда выполняется поиск, извлеките весь установленный результаткеша
3) Фильтр этого набора результатов на основе критериев поиска.Дайте каждому результату поиска оценку «релевантности».
4) Отправьте отфильтрованные результаты в базу данных через xml, чтобы получить биты, которые нельзя кэшировать (например, цены)
5)Показать окончательные результаты
Это все работает и работает с молниеносной скоростью, но для достижения (3) я дал каждому результату оценку «релевантности».Это просто целое число члена в каждом объекте результатов поиска.Я перебираю весь набор результатов и соответствующим образом обновляю этот счет, а затем упорядочиваю его в конце.
Проблема, с которой я столкнулся, заключается в том, что элемент "релевантности" сохраняет это значение от поиска к поиску.Я предполагаю, что это потому, что я обновляю ссылку на результаты поиска в кеше, а не на новый объект, поэтому его обновление также обновляет кэшированную версию.То, что я ищу, это аккуратное решение, чтобы обойти это.До сих пор я придумал:
а) Клонировать кеш, когда я его получу.
б) Создайте отдельный словарь для хранения релевантностей и сопоставьте их в конце
Я упускаю действительно очевидное и чистое решение или я должен пойти по одному из этих маршрутов?Я использую C # и .net.
Надеюсь, из описания должно быть очевидно, к чему я клоню, так или иначе, вот код;этот первый - итерация кешированных результатов для выполнения фильтрации;
private List<QuickSearchResult> performFiltering(string keywords, string regions, List<QuickSearchResult> cachedSearchResults)
{
List<QuickSearchResult> filteredItems = new List<QuickSearchResult>();
string upperedKeywords = keywords.ToUpper();
string[] keywordsArray = upperedKeywords.Split(' ');
string[] regionsArray = regions.Split(',');
foreach (var item in cachedSearchResults)
{
//Check for keywords
if (keywordsArray != null)
{
if (!item.ContainsKeyword(upperedKeywords, keywordsArray))
continue;
}
//Check for regions
if (regionsArray != null)
{
if (!item.IsInRegion(regionsArray))
continue;
}
filteredItems.Add(item);
}
return filteredItems.OrderBy(t=> t.Relevance).Take(_maxSearchResults).ToList<QuickSearchResult>();
}
и вот пример метода "IsInRegion" объекта QuickSearchResult;
public bool IsInRegion(string[] regions)
{
int relevanceScore = 0;
foreach (var region in regions)
{
int parsedRegion = 0;
if (int.TryParse(region, out parsedRegion))
{
foreach (var thisItemsRegion in this.Regions)
{
if (thisItemsRegion.ID == parsedRegion)
relevanceScore += 10;
}
}
}
Relevance += relevanceScore;
return relevanceScore > 0;
}
И в основном, если я ищу "Лондон", я получаю оценку "10"первый раз" 20 "второй раз ...