public Query GenerateLuceneQuery(string query, ILocationGroupingStrategy groupingStrategy) { var parser = new MultiFieldQueryParser(Version.LUCENE_29, groupingStrategy.Fields.Select(f => f.Name).ToArray(), _analyzer); parser.DefaultOperator = QueryParser.Operator.AND; Query luceneQuery = parser.Parse(query); return luceneQuery; }
public IEnumerable<LocationGroupModel> Search(string addressQuery, ILocationGroupingStrategy groupingStrategy) { ValidateAndThrow(addressQuery); var sanitisedQuery = _searchSanitiser.Sanitise(addressQuery); var results = _groupRepository.FindGroupedLocations(sanitisedQuery, groupingStrategy); var refinedResults = RequeryIfRequired(results.ToList(), sanitisedQuery, groupingStrategy); return refinedResults.Select(lg => new LocationGroupModel(lg.GroupDescription, lg.LocationsCount, BuildNextUri(lg))); }
public IEnumerable<LocationGroup> FindGroupedLocations(string query, ILocationGroupingStrategy groupingStrategy) { var wildcardQuery = query.Trim() + "*"; var queryFields = groupingStrategy.Fields; if (query.Any(c => Char.IsDigit(c))) queryFields = queryFields.Concat(new List<LocationQueryField>() {_queryFields.HouseNumber}); var luceneQuery = GenerateLuceneQuery(wildcardQuery, queryFields); var collector = new GroupCollector(_locationGroupBuilder, groupingStrategy.Fields); _searcher.Search(luceneQuery, collector); return collector.Groups.OrderBy(g => g.GroupDescription, new AlphanumericComparerFast()); }
public IEnumerable<LocationGroup> FindLocations(string addressLookup, ILocationGroupingStrategy groupingStrategy) { var tokenizer = new fTSQueryTokenizer(addressLookup); var statement = new FtsQueryGenerator(groupingStrategy, tokenizer).Generate(); List<LocationGroup> locations = new List<LocationGroup>(); using (IManagedDataReader reader = _connectionManager.GetReader(statement, new StatementParamaters() { { "@addressSearch", "'" + addressLookup + "*'" } })) { while (reader.Read()) { locations.Add(_locationGroupBuilder.Build(reader.DataReader, groupingStrategy.Fields)); } } return locations; }
private IEnumerable<LocationGroup> RequeryIfRequired(ICollection<LocationGroup> results, string addressQuery, ILocationGroupingStrategy groupingStrategy) { var locationsSum = results.Sum(g => g.LocationsCount); if (!results.Any() || locationsSum == 0) return results; if (results.HasSingleGroup() || locationsSum < GROUPING_THRESHOLD) { var groupingStrategyBuilder = new LocationGroupingStrategyBuilder(_locationQueryFields.PrimaryText) .ThenBy(_locationQueryFields.SecondaryText) .ThenBy(_locationQueryFields.HouseNumber) .ThenBy(groupingStrategy); return _groupRepository.FindGroupedLocations(addressQuery, groupingStrategyBuilder.Build()); } return results; }
public LocationGroupingStrategyBuilder(ILocationGroupingStrategy groupingStrategy) { _fields.AddRange(groupingStrategy.Fields); }
public LocationGroupingStrategyBuilder ThenBy(ILocationGroupingStrategy groupingStrategy) { _fields.AddRange(groupingStrategy.Fields); return this; }