//основной метод поиска public JObject Search(JObject JsearchString) { string result = string.Empty; JObject objResult = new JObject(); //JavaScriptSerializer ser = new JavaScriptSerializer(); Logger("Calling xsearch method"); try { //инстанс поискового движка _xInstance = SearchEngine.XSearch.GetInstance; //TODO сделать проверку на пустую строку поиска нет "searchstring" и значения, например возникает когда двигаемся назад в поиск после выбора услуги string query = string.Empty; //JsearchString.TryGetValue(searchString, out query); query = JsearchString[searchString].ToString().Trim(charsToTrim); //делегат для асинхронного вызова SearchEngine.AsyncSearch asearch = new SearchEngine.AsyncSearch(_xInstance.Search); //сделано синхронно для UI, можно добавить Callback для асинхронного запроса IAsyncResult res = asearch.BeginInvoke(query, null, null); res.AsyncWaitHandle.WaitOne(); // вызываем EndInvoke чтобы получить результат. List <SearchEngine.XSearchObjJSON> searchResult = asearch.EndInvoke(res); // Close the wait handle. res.AsyncWaitHandle.Close(); //сериализуем в json objResult[xArray] = JToken.FromObject(searchResult); } catch (MissingMethodException) { String message = "Incorrect search conditions: "; //result = ser.Serialize(message); objResult = (JObject)Newtonsoft.Json.JsonConvert.SerializeObject(message); Logger(message + searchString); } catch (Exception ex) { String message = "Fatal search error: "; //result = ser.Serialize(message); objResult = (JObject)Newtonsoft.Json.JsonConvert.SerializeObject(message); Logger(message + ex.Message); } return(objResult); }
//обновление индекса услуг private void RefreshIndex() { //получаем инстанс поискового движка (из-за ленивой инициализации синглтона память и время не будут расходоваться) _xInstance = SearchEngine.XSearch.GetInstance; List <SearchEngine.XSearchObj> fromSetting = new List <SearchEngine.XSearchObj>(); //если включено исключение ограничения меню по поиску bool withoutMenu = false; withoutMenu = !String.IsNullOrEmpty(XSetting.WithoutMenu); _alias = !withoutMenu ? string.Empty : XSetting.WithoutMenu; //if (!withoutMenu) { //парсим сеттинг (внимание, изменяется WhereIn в xInstance, его подставим в выражение ниже!!!) fromSetting = _xInstance.ParseSetting(settingsPath); } _xInstance.OpenWriter(); //"SearchTags" - поле в базе SQL которое совмещает в себе название услуги и ключевые слова по которым ищем SqlCommand sqlCommand = new SqlCommand(GetSqlqueryService(string.Join(",", _additionalAttrsName))); //обновляем индекс ExecuteSqlQuery(sqlCommand, _callBackQueryServices); //закрываем Writer индекса _xInstance.CloseWriter(); //добавляем документы (услуги) в индекс //_xInstance.AddDocuments(ref searchList, true, false); //если включено исключение ограничения меню по поиску //if (!withoutMenu) { //объединяем результаты парсинга сеттинга и индекса _xInstance.MergeWithScenAliasList(fromSetting, withoutMenu); } //очищаем накопленные услуги _searchList.Clear(); Logger("Index refreshed"); }