public static InsolvenceSearchResult SimpleSearch(InsolvenceSearchResult search, bool withHighlighting = false) { var client = Manager.GetESClient_Insolvence(); var page = search.Page - 1 < 0 ? 0 : search.Page - 1; var sw = new StopWatchEx(); sw.Start(); search.Q = SearchTools.FixInvalidQuery(search.Q ?? "", queryShorcuts, queryOperators); ISearchResponse <Rizeni> res = null; try { res = client .Search <Rizeni>(s => s .Size(search.PageSize) .ExpandWildcards(Elasticsearch.Net.ExpandWildcards.All) .From(page * search.PageSize) .Source(sr => sr.Excludes(r => r.Fields("dokumenty.plainText"))) .Query(q => GetSimpleQuery(search)) .Sort(ss => new SortDescriptor <Rizeni>().Field(m => m.Field(f => f.PosledniZmena).Descending())) .Highlight(h => Lib.ES.SearchTools.GetHighlight <Rizeni>(withHighlighting)) ); } catch (Exception e) { if (res != null && res.ServerError != null) { Manager.LogQueryError <Rizeni>(res, "Exception, Orig query:" + search.OrigQuery + " query:" + search.Q + "\n\n res:" + search.Result.ToString() , ex: e); } else { HlidacStatu.Util.Consts.Logger.Error("", e); } throw; } sw.Stop(); if (res.IsValid == false) { Manager.LogQueryError <Rizeni>(res, "Exception, Orig query:" + search.OrigQuery + " query:" + search.Q + "\n\n res:" + search.Result?.ToString() ); } search.Total = res?.Total ?? 0; search.IsValid = res?.IsValid ?? false; search.ElasticResults = res; search.ElapsedTime = sw.Elapsed; return(search); }
public ActionResult Hledat(InsolvenceSearchResult model) { if (model == null || ModelState.IsValid == false) { return(View(new InsolvenceSearchResult())); } var res = Insolvence.SimpleSearch(model); return(View(res)); }
public static QueryContainer GetSimpleQuery(InsolvenceSearchResult searchdata) { var query = searchdata.Q; string regexPrefix = @"(^|\s|[(])"; string regexTemplate = "{0}(?<q>(-|\\w)*)\\s*"; //fix field prefixes //ds: -> string[,] rules = new string[, ] { { @"osobaid:(?<q>((\w{1,} [-]{1} \w{1,})([-]{1} \d{1,3})?)) (\s|$){1,}", "${ico}" }, { @"holding:(?<q>(\d{1,8})) (\s|$){1,}", "${ico}" }, { regexPrefix + "ico:", "(dluznici.iCO:${q} OR veritele.iCO:${q} OR spravci.iCO:${q}) " }, { regexPrefix + "icodluznik:", "dluznici.iCO:" }, { regexPrefix + "icoveritel:", "veritele.iCO:" }, { regexPrefix + "icospravce:", "spravci.iCO:" }, { regexPrefix + "jmeno:", "(dluznici.plneJmeno:${q} OR veritele.plneJmeno:${q} OR spravci.plneJmeno:${q})" }, { regexPrefix + "jmenodluznik:", "dluznici.plneJmeno:" }, { regexPrefix + "jmenoveritel:", "veritele.plneJmeno:" }, { regexPrefix + "jmenospravce:", "spravci.plneJmeno:" }, { regexPrefix + "spisovaznacka:", "spisovaZnacka:" }, { regexPrefix + "id:", "spisovaZnacka:" }, { "zmeneno:\\[", "posledniZmena:[" }, { "zmeneno:(?=[<>])", "posledniZmena:${q}" }, { "zmeneno:(?=\\d)", "posledniZmena:[${q} TO ${q}||+1d]" }, { "zahajeno:\\[", "datumZalozeni:[" }, { "zahajeno:(?=[<>])", "datumZalozeni:${q}" }, { "zahajeno:(?=\\d)", "datumZalozeni:[${q} TO ${q}||+1d]" }, { regexPrefix + "stav:", "stav:" }, { regexPrefix + "text:", "dokumenty.plainText:" }, { regexPrefix + "typdokumentu:", "dokumenty.popis:" }, { regexPrefix + "dokumenttyp:", "dokumenty.popis:" }, { regexPrefix + "oddil:", "dokumenty.oddil:" }, }; string modifiedQ = query; // ES.SearchTools.FixInvalidQuery(query, queryShorcuts, queryOperators) ?? ""; //check invalid query ( tag: missing value) for (int i = 0; i < rules.GetLength(0); i++) { string lookFor = rules[i, 0]; string replaceWith = rules[i, 1]; MatchEvaluator evalMatch = (m) => { var s = m.Value; if (string.IsNullOrEmpty(s)) { return(string.Empty); } var newVal = replaceWith; if (newVal.Contains("${q}")) { newVal = newVal.Replace("${q}", m.Groups["q"].Value); } if (s.StartsWith("(")) { return(" (" + newVal); } else { return(" " + newVal); } }; //if (modifiedQ.ToLower().Contains(lookFor.ToLower())) if (Regex.IsMatch(modifiedQ, lookFor, regexQueryOption)) { if (replaceWith.Contains("${q}")) { modifiedQ = Regex.Replace(modifiedQ, string.Format(regexTemplate, lookFor), evalMatch, regexQueryOption); } else if (lookFor.Contains("holding:")) { //list of ICO connected to this person Match m = Regex.Match(modifiedQ, lookFor, regexQueryOption); string holdingIco = m.Groups["q"].Value; HlidacStatu.Lib.Data.Relation.AktualnostType aktualnost = HlidacStatu.Lib.Data.Relation.AktualnostType.Nedavny; Data.Firma f = Data.Firmy.Get(holdingIco); if (f != null && f.Valid) { var icos = new string[] { f.ICO } .Union(f.AktualniVazby(aktualnost) .Select(s => s.To.Id) ) .Distinct(); string icosQuery = ""; var icosPresLidi = f.AktualniVazby(aktualnost) .Where(o => o.To.Type == Graph.Node.NodeType.Person) .Select(o => Data.Osoby.GetById.Get(Convert.ToInt32(o.To.Id))) .Where(o => o != null) .SelectMany(o => o.AktualniVazby(aktualnost)) .Select(v => v.To.Id) .Distinct(); icos = icos.Union(icosPresLidi).Distinct(); var templ = "(ico:{0})"; if (icos != null && icos.Count() > 0) { icosQuery = "(" + icos .Select(t => string.Format(templ, t)) .Aggregate((fi, s) => fi + " OR " + s) + ")"; } else { icosQuery = "(ico:noOne)"; } modifiedQ = Regex.Replace(modifiedQ, lookFor, icosQuery, regexQueryOption); } } //do regex replace else if (replaceWith.Contains("${ico}")) { //list of ICO connected to this person Match m = Regex.Match(modifiedQ, lookFor, regexQueryOption); string nameId = m.Groups["q"].Value; Data.Osoba p = Data.Osoby.GetByNameId.Get(nameId); string icosQuery = ""; if (p != null) { var icos = p .AktualniVazby(Data.Relation.AktualnostType.Nedavny) .Where(w => !string.IsNullOrEmpty(w.To.Id)) .Where(w => Analysis.ACore.GetBasicStatisticForICO(w.To.Id).Summary.Pocet > 0) .Select(w => w.To.Id) .Distinct().ToArray(); var templ = "(ico:{0})"; if (icos != null && icos.Length > 0) { icosQuery = "(" + icos .Select(t => string.Format(templ, t)) .Aggregate((f, s) => f + " OR " + s) + ")"; } else { icosQuery = "(ico:noOne)"; } modifiedQ = Regex.Replace(modifiedQ, lookFor, icosQuery, regexQueryOption); } else { modifiedQ = Regex.Replace(modifiedQ, lookFor, "(ico:noOne)", regexQueryOption); } } else { modifiedQ = Regex.Replace(modifiedQ, lookFor, evalMatch, regexQueryOption); } } } QueryContainer qc = null; if (modifiedQ == null) { qc = new QueryContainerDescriptor <Rizeni>().MatchNone(); } else if (string.IsNullOrEmpty(modifiedQ)) { qc = new QueryContainerDescriptor <Rizeni>().MatchAll(); } else { modifiedQ = modifiedQ.Replace(" | ", " OR ").Trim(); qc = new QueryContainerDescriptor <Rizeni>() .QueryString(qs => qs .Query(modifiedQ) .DefaultOperator(Operator.And) ); } return(qc); }
public static QueryContainer GetSimpleQuery(InsolvenceSearchResult searchdata) { var query = searchdata.Q; //fix field prefixes //ds: -> Lib.Searching.Rule[] rules = new Lib.Searching.Rule[] { new Lib.Searching.Rule(@"osobaid:(?<q>((\w{1,} [-]{1} \w{1,})([-]{1} \d{1,3})?)) ", "ico"), new Lib.Searching.Rule(@"osobaiddluznik:(?<q>((\w{1,} [-]{1} \w{1,})([-]{1} \d{1,3})?)) ", "icodluznik"), new Lib.Searching.Rule(@"osobaidveritel:(?<q>((\w{1,} [-]{1} \w{1,})([-]{1} \d{1,3})?)) ", "icoveritel"), new Lib.Searching.Rule(@"osobaidspravce:(?<q>((\w{1,} [-]{1} \w{1,})([-]{1} \d{1,3})?)) ", "icospravce"), new Lib.Searching.Rule(@"holding:(?<q>(\d{1,8})) (\s|$){1,}", "ico"), new Lib.Searching.Rule(@"holdindluznik:(?<q>(\d{1,8})) (\s|$){1,}", "icodluznik"), new Lib.Searching.Rule(@"holdingveritel:(?<q>(\d{1,8})) (\s|$){1,}", "icoveritel"), new Lib.Searching.Rule(@"holdingspravce:(?<q>(\d{1,8})) (\s|$){1,}", "icospravce"), new Lib.Searching.Rule("ico:", "(dluznici.iCO:${q} OR veritele.iCO:${q} OR spravci.iCO:${q}) "), new Lib.Searching.Rule("icodluznik:", "dluznici.iCO:"), new Lib.Searching.Rule("icoveritel:", "veritele.iCO:"), new Lib.Searching.Rule("icospravce:", "spravci.iCO:"), new Lib.Searching.Rule("jmeno:", "(dluznici.plneJmeno:${q} OR veritele.plneJmeno:${q} OR spravci.plneJmeno:${q})"), new Lib.Searching.Rule("jmenodluznik:", "dluznici.plneJmeno:"), new Lib.Searching.Rule("jmenoveritel:", "veritele.plneJmeno:"), new Lib.Searching.Rule("jmenospravce:", "spravci.plneJmeno:"), new Lib.Searching.Rule("spisovaznacka:", "spisovaZnacka:"), new Lib.Searching.Rule("id:", "spisovaZnacka:"), new Lib.Searching.Rule("zmeneno:\\[", "posledniZmena:["), new Lib.Searching.Rule("zmeneno:(?=[<>])", "posledniZmena:${q}"), new Lib.Searching.Rule("zmeneno:(?=\\d)", "posledniZmena:[${q} TO ${q}||+1d}"), new Lib.Searching.Rule("zahajeno:\\[", "datumZalozeni:["), new Lib.Searching.Rule("zahajeno:(?=[<>])", "datumZalozeni:${q}"), new Lib.Searching.Rule("zahajeno:(?=\\d)", "datumZalozeni:[${q} TO ${q}||+1d}"), new Lib.Searching.Rule("stav:", "stav:"), new Lib.Searching.Rule("text:", "dokumenty.plainText:"), new Lib.Searching.Rule("texttypdokumentu:", "dokumenty.popis:"), new Lib.Searching.Rule("typdokumentu:", "dokumenty.typUdalosti:"), new Lib.Searching.Rule("oddil:", "dokumenty.oddil:"), }; IRule[] irules = new IRule[] { new OsobaId("osobaid:", "ico:"), new OsobaId("osobaiddluznik:", "icodluznik:"), new OsobaId("osobaidveritel:", "icoveritel:"), new OsobaId("osobaidspravce:", "icospravce:"), new Holding("holding:", "ico:"), new Holding("holdindluznik:", "icoplatce:"), new Holding("holdingveritel:", "icoveritel:"), new Holding("holdingspravce:", "icospravce:"), new TransformPrefixWithValue("ico:", "(dluznici.iCO:${q} OR veritele.iCO:${q} OR spravci.iCO:${q}) ", null), new TransformPrefixWithValue("jmeno:", "(dluznici.plneJmeno:${q} OR veritele.plneJmeno:${q} OR spravci.plneJmeno:${q})", null), new TransformPrefix("icodluznik:", "dluznici.iCO:", null), new TransformPrefix("icoveritel:", "veritele.iCO:", null), new TransformPrefix("icospravce:", "spravci.iCO:", null), new TransformPrefix("jmenodluznik:", "dluznici.plneJmeno:", null), new TransformPrefix("jmenoveritel:", "veritele.plneJmeno:", null), new TransformPrefix("jmenospravce:", "spravci.plneJmeno:", null), new TransformPrefix("spisovaznacka:", "spisovaZnacka:", null), new TransformPrefix("id:", "spisovaZnacka:", null), new TransformPrefix("zmeneno:", "posledniZmena:", "[<>]?[{\\[]+"), new TransformPrefixWithValue("zmeneno:", "posledniZmena:[${q} TO ${q}||+1d}", "\\d+"), new TransformPrefix("zahajeno:", "datumZalozeni:", "[<>]?[{\\[]+"), new TransformPrefixWithValue("zahajeno:", "datumZalozeni:[${q} TO ${q}||+1d}", "\\d+"), new TransformPrefix("stav:", "stav:", null), new TransformPrefix("text:", "dokumenty.plainText:", null), new TransformPrefix("texttypdokumentu:", "dokumenty.popis:", null), new TransformPrefix("typdokumentu:", "dokumenty.typUdalosti:", null), new TransformPrefix("oddil:", "dokumenty.oddil:", null), }; string modifiedQ = query; // Search.Tools.FixInvalidQuery(query, queryShorcuts, queryOperators) ?? ""; //check invalid query ( tag: missing value) if (searchdata.LimitedView) { modifiedQ = Lib.Searching.Query.ModifyQueryAND(modifiedQ, "onRadar:true"); } //var qc = Lib.Search.Tools.GetSimpleQuery<Lib.Data.Insolvence.Rizeni>(modifiedQ, rules); ; var qc = Lib.Searching.SimpleQueryCreator.GetSimpleQuery <Lib.Data.Insolvence.Rizeni>(modifiedQ, irules); return(qc); }
public static InsolvenceSearchResult SimpleSearch(InsolvenceSearchResult search, bool withHighlighting = false, AggregationContainerDescriptor <Lib.Data.Insolvence.Rizeni> anyAggregation = null, bool exactNumOfResults = false) { var client = Manager.GetESClient_Insolvence(); var page = search.Page - 1 < 0 ? 0 : search.Page - 1; var sw = new Devmasters.DT.StopWatchEx(); sw.Start(); search.OrigQuery = search.Q; search.Q = Lib.Searching.Tools.FixInvalidQuery(search.Q ?? "", queryShorcuts, queryOperators); var sq = GetSimpleQuery(search); ISearchResponse <Rizeni> res = null; try { res = client .Search <Rizeni>(s => s .Size(search.PageSize) .ExpandWildcards(Elasticsearch.Net.ExpandWildcards.All) .From(page * search.PageSize) .Source(sr => sr.Excludes(r => r.Fields("dokumenty.plainText"))) .Query(q => sq) //.Sort(ss => new SortDescriptor<Rizeni>().Field(m => m.Field(f => f.PosledniZmena).Descending())) .Sort(ss => GetSort(search.Order)) .Highlight(h => Lib.Searching.Tools.GetHighlight <Rizeni>(withHighlighting)) .Aggregations(aggr => anyAggregation) .TrackTotalHits(search.ExactNumOfResults || page * search.PageSize == 0 ? true : (bool?)null) ); if (withHighlighting && res.Shards != null && res.Shards.Failed > 0) //if some error, do it again without highlighting { res = client .Search <Rizeni>(s => s .Size(search.PageSize) .ExpandWildcards(Elasticsearch.Net.ExpandWildcards.All) .From(page * search.PageSize) .Source(sr => sr.Excludes(r => r.Fields("dokumenty.plainText"))) .Query(q => sq) //.Sort(ss => new SortDescriptor<Rizeni>().Field(m => m.Field(f => f.PosledniZmena).Descending())) .Sort(ss => GetSort(search.Order)) .Highlight(h => Lib.Searching.Tools.GetHighlight <Rizeni>(false)) .Aggregations(aggr => anyAggregation) .TrackTotalHits(search.ExactNumOfResults || page * search.PageSize == 0 ? true : (bool?)null) ); } } catch (Exception e) { Audit.Add(Audit.Operations.Search, "", "", "Insolvence", "error", search.Q, null); if (res != null && res.ServerError != null) { Manager.LogQueryError <Rizeni>(res, "Exception, Orig query:" + search.OrigQuery + " query:" + search.Q + "\n\n res:" + search.ElasticResults.ToString() , ex: e); } else { HlidacStatu.Util.Consts.Logger.Error("", e); } throw; } sw.Stop(); Audit.Add(Audit.Operations.Search, "", "", "Insolvence", res.IsValid ? "valid" : "invalid", search.Q, null); if (res.IsValid == false) { Manager.LogQueryError <Rizeni>(res, "Exception, Orig query:" + search.OrigQuery + " query:" + search.Q + "\n\n res:" + search.ElasticResults?.ToString() ); } search.Total = res?.Total ?? 0; search.IsValid = res?.IsValid ?? false; search.ElasticResults = res; search.ElapsedTime = sw.Elapsed; return(search); }