Ejemplo n.º 1
0
        /// <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());
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }