public IEnumerable<ParsedAddressPart> GetChildren(string code) { int? level = _Base.GetLevel(code); if (!level.HasValue) { _log.Warn(ClassName + String.Format("Для кода: {0} не найден уровень в КЛАДР", code)); yield break; } while (true) { string queryString = GetQueryChildren(level.Value, code); if (string.IsNullOrEmpty(queryString)) yield break; level++; // необходимый уровень var parser = new QueryParser(Version.LUCENE_30, "id", _analyzer); Query query = parser.Parse(queryString); var searcher = GetSearcher(); if (searcher == null) yield break; TopDocs hits = searcher.Search(query, int.MaxValue); int no = 0; var totalHits = hits.TotalHits; if (totalHits < 2) continue; var lastInfo = new ParsedAddressPartInfo(); while (no < totalHits) { lastInfo.No = no; lastInfo.TotalHits = totalHits; Document doc = searcher.Doc(hits.ScoreDocs[no].Doc); int lvl = int.Parse(doc.Get("lvl")); if (lvl == level) { ParsedAddressPart part = new ParsedAddressPart(); part.LastInfo = lastInfo; part.Id = doc.Get("id"); part.Level = lvl; part.Reduction = doc.Get("reduction"); part.Name = doc.Get("name"); part.NameWithShortReduction = doc.Get("name_short_reduction"); part.NameWithReduction = doc.Get("name_reduction"); yield return part; } no++; } yield break; } }
public IEnumerable<AddressPartIndexSearch> Search(string filter) { if (string.IsNullOrEmpty(filter)) yield break; var queryBuilder = new StringBuilder(); foreach (Match match in SPLIT.Matches(filter)) { if (queryBuilder.Length > 0) queryBuilder.Append(" "); queryBuilder.Append("+" + match.Value.ToLowerInvariant() + "*"); } var queryString = queryBuilder.ToString(); if (string.IsNullOrEmpty(queryString)) yield break; var parser = new QueryParser(Version.LUCENE_30, "searchName", _analyzer); Query query = parser.Parse(queryString); var searcher = GetSearcher(); if (searcher == null) yield break; TopDocs hits = searcher.Search(query, int.MaxValue); int no = 0; var totalHits = hits.TotalHits; var lastInfo = new ParsedAddressPartInfo(); while (no < totalHits) { lastInfo.No = no; lastInfo.TotalHits = totalHits; Document doc = searcher.Doc(hits.ScoreDocs[no].Doc); AddressPartIndexSearch d = new AddressPartIndexSearch(); d.Id = doc.Get("id"); d.PostalCode = doc.Get("postalCode"); d.Level = int.Parse(doc.Get("lvl")); d.Reduction = doc.Get("reduction"); d.Name = doc.Get("name"); d.NameWithShortReduction = doc.Get("name_short_reduction"); d.NameWithReduction = doc.Get("name_reduction"); d.FullName = doc.Get("fullName"); d.LastInfo = lastInfo; yield return d; no++; } }
public IEnumerable<AddressPartIndexSearch> GetByIndex4Search(string index) { if (!string.IsNullOrEmpty(index) && !_Base.INDEX.IsMatch(index)) { _log.Warn(ClassName + String.Format("Значение: {0} не может быть почтовым индексом", index)); yield break; } var parser = new QueryParser(Version.LUCENE_30, "postalCode", _analyzer); Query query = parser.Parse("+" + index); var searcher = GetSearcher(); if (searcher == null) yield break; TopDocs hits = searcher.Search(query, int.MaxValue); int no = 0; var totalHits = hits.TotalHits; var lastInfo = new ParsedAddressPartInfo(); while (no < totalHits) { lastInfo.No = no; lastInfo.TotalHits = totalHits; Document doc = searcher.Doc(hits.ScoreDocs[no].Doc); int lvl = int.Parse(doc.Get("lvl")); if (lvl == _Base.LastLevel) { AddressPartIndexSearch d = new AddressPartIndexSearch(); d.Id = doc.Get("id"); d.PostalCode = doc.Get("postalCode"); d.Level = lvl; d.Reduction = doc.Get("reduction"); d.Name = doc.Get("name"); d.NameWithShortReduction = doc.Get("name_short_reduction"); d.NameWithReduction = doc.Get("name_reduction"); d.FullName = doc.Get("fullName"); d.LastInfo = lastInfo; yield return d; } no++; } }