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++; } }