//основной метод поиска
        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");
        }