Пример #1
0
        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);
        }
Пример #2
0
        public ActionResult Hledat(InsolvenceSearchResult model)
        {
            if (model == null || ModelState.IsValid == false)
            {
                return(View(new InsolvenceSearchResult()));
            }

            var res = Insolvence.SimpleSearch(model);

            return(View(res));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }