/// <summary> /// Поиск в МФЦ. /// Ищем по алгоритму левенштейна, если нет, то по подстроке (надо доработать его), если нет, то модифицированный поиск по подстроке (для офисов поиск ведется и по адресу) /// </summary> /// <param name="data"></param> /// <param name="query"></param> /// <param name="metadata"></param> /// <returns></returns> public List <FuzzySearchResult> Search(List <FuzzySearchResult> data, string query, string metadata = null) { // в метадате хранятся ID найденных объектов на предыдущих этапах. if (metadata != null) { var IDS = metadata.Split(';'); var temp = new List <FuzzySearchResult>(); for (int i = 0; i < IDS.Length - 1; i++) { temp.Add(data.FirstOrDefault(x => x.ID == int.Parse(IDS[i]))); temp[i].KeyWords = $"{i + 1}"; } // не пустая метадата говорит о том, что поиск будет проходить по ней data = temp; } var reader = new MindReader(data, 0.5); //основной поиск (левенштей) var result = reader.BotMainSearch(query); if (result.Count != 0) { result = result.DistinctBy(c => c.ID).ToList(); // убираем повторяющиеся result.Sort(); // сортируем по distinction result = DeleteBadResults(result); // исключаем плохо найденные результаты } else { //поиск по подстроке (нужно доработать) result = reader.BotSecondSearch(query); if (result.Count != 0) { result = result.DistinctBy(c => c.ID).ToList(); // убираем повторяющиеся result.Sort(); // сортируем по distinction result = DeleteBadResults(result); // исключаем плохо найденные результаты } } if (result.Count == 0) { //если ничего не найдено, то проводим мод. поиск по подстроке if (data[0]?.DataType == FuzzySearchResultDataType.Office) { result = GetOfficesContainsQuerry(query); } else { result = GetResultsContainsQuerry(data, query); } } return(result.ToList()); }
private List <FuzzySearchResult> Search(string query, List <FuzzySearchResult> fuzzySearchData, double accuracy = 0.5, bool IsCustomer = false) { var reader = new MindReader(fuzzySearchData, accuracy); // нечеткий поиск fuzzySearchData = reader.BotMainSearch(query); fuzzySearchData.Sort(); if (IsCustomer) { fuzzySearchData = fuzzySearchData.DistinctBy(x => x.CustomersKey).ToList(); } else { fuzzySearchData = fuzzySearchData.DistinctBy(x => x.ID).ToList(); } if (fuzzySearchData.Count != 0) { fuzzySearchData = DeleteBadResults(fuzzySearchData); } else { // поиск по подстроке fuzzySearchData = reader.BotSecondSearch(query); fuzzySearchData.Sort(); if (IsCustomer) { fuzzySearchData = fuzzySearchData.DistinctBy(x => x.CustomersKey).ToList(); } else { fuzzySearchData = fuzzySearchData.DistinctBy(x => x.ID).ToList(); } if (fuzzySearchData.Count != 0) { fuzzySearchData = DeleteBadResults(fuzzySearchData); } } return(fuzzySearchData); }
public List <FuzzySearchResult> GetCustomer(List <string> customerNames, List <BotCustomer> customers) { var qa = new QueryAnaliser(); var fuzzySearchDataofCustomers = customers.Select(x => new FuzzySearchModel { FuzzySearchModelID = x.BotCustomerID, Name = x.Name, KeyWords = x.KeyWords + ", " + x.City }).ToList(); var results = new List <FuzzySearchResult>(); foreach (var item in customerNames) { var reader = new MindReader(fuzzySearchDataofCustomers, 0.5); var result = reader.BotMainSearch(item); if (result.Count != 0) { result = result.DistinctBy(c => c.ID).ToList(); result.Sort(); result = qa.DeleteBadREsults(result); } else { result = reader.BotSecondSearch(item); if (result.Count != 0) { result = result.DistinctBy(c => c.ID).ToList(); result.Sort(); result = qa.DeleteBadREsults(result); } } results.AddRange(result); } results.Sort(); return(results); }