protected virtual Lucene.Net.Search.Query VisitWithinRadius(WithinRadiusNode node, LuceneQueryMapperState mappingState) { SpatialContext ctx = SpatialContext.GEO; var strategy = new PointVectorStrategy(ctx, Sitecore.ContentSearch.Spatial.Common.Constants.LocationFieldName); if (node.Latitude is double && node.Longitude is double && node.Radius is double) { var distance = DistanceUtils.Dist2Degrees((double)node.Radius, DistanceUtils.EARTH_MEAN_RADIUS_MI); Circle circle = ctx.MakeCircle((double)node.Longitude, (double)node.Latitude, distance); var spatialArgs = new SpatialArgs(SpatialOperation.Intersects, circle); var dq = strategy.MakeQuery(spatialArgs); DistanceReverseValueSource valueSource = new DistanceReverseValueSource(strategy, circle.GetCenter(), distance); ValueSourceFilter vsf = new ValueSourceFilter(new QueryWrapperFilter(dq), valueSource, 0, distance); var filteredSpatial = new FilteredQuery(new MatchAllDocsQuery(), vsf); Lucene.Net.Search.Query spatialRankingQuery = new FunctionQuery(valueSource); BooleanQuery bq = new BooleanQuery(); bq.Add(filteredSpatial, Occur.MUST); bq.Add(spatialRankingQuery, Occur.MUST); return(bq); } throw new NotSupportedException("Wrong parameters type, Radius, latitude and longitude must be of type double"); }
protected virtual Lucene.Net.Search.Query VisitWithinRadius(WithinRadiusNode node, LuceneQueryMapperState mappingState) { SpatialContext ctx = SpatialContext.GEO; var strategy = new PointVectorStrategy(ctx, Sitecore.ContentSearch.Spatial.Common.Constants.LocationFieldName); if (node.Latitude is double && node.Longitude is double && node.Radius is double) { var distance = DistanceUtils.Dist2Degrees((double)node.Radius, DistanceUtils.EARTH_MEAN_RADIUS_MI); Circle circle = ctx.MakeCircle((double)node.Longitude, (double)node.Latitude, distance); var spatialArgs = new SpatialArgs(SpatialOperation.IsWithin, circle); var dq = strategy.MakeQuery(spatialArgs); DistanceReverseValueSource valueSource = new DistanceReverseValueSource(strategy, circle.GetCenter(), distance); ValueSourceFilter vsf = new ValueSourceFilter(new QueryWrapperFilter(dq), valueSource, 0, distance); var filteredSpatial = new FilteredQuery(new MatchAllDocsQuery(), vsf); mappingState.FilterQuery = filteredSpatial; Lucene.Net.Search.Query spatialRankingQuery = new FunctionQuery(valueSource); Random r = new Random(DateTime.Now.Millisecond); var randomNumber = r.Next(10000101, 11000101); Lucene.Net.Search.Query dummyQuery = Lucene.Net.Search.NumericRangeQuery.NewIntRange("__smallcreateddate", randomNumber, Int32.Parse(DateTime.Now.ToString("yyyyMMdd")), true, true); BooleanQuery bq = new BooleanQuery(); bq.Add(filteredSpatial, Occur.MUST); bq.Add(spatialRankingQuery, Occur.MUST); bq.Add(dummyQuery, Occur.SHOULD); return(bq); } throw new NotSupportedException("Wrong parameters type, Radius, latitude and longitude must be of type double"); }
protected virtual AbstractSolrQuery VisitWithinRadius(WithinRadiusNode radiusNode, SolrQueryMapper.SolrQueryMapperState state) { var orignialQuery = this.Visit(radiusNode.SourceNode, state); var spatialQuery = new SolrQuery(string.Format("{{!geofilt pt={0},{1} sfield={2} d={3} score=distance}}", radiusNode.Lat, radiusNode.Lon, radiusNode.Field, (int)radiusNode.Radius)); var combinedQuery = orignialQuery && spatialQuery; return(combinedQuery); }
/// <summary> /// Provides a Geo Spatial Search Query linq provider. /// </summary> /// <param name="radiusNode"></param> /// <param name="state"></param> /// <returns></returns> protected virtual string VisitWithinRadius(WithinRadiusNode radiusNode, CloudQueryMapper.CloudQueryMapperState state) { var orderBy = string.Empty; if ((bool)radiusNode.DistanceSort) { orderBy = $"&$orderby=geo.distance({radiusNode.FieldName}, geography'POINT({radiusNode.Longitude} {radiusNode.Latitude})') asc"; } var queryText = $"&search=*&$top={radiusNode.MaxResults}&$filter=geo.distance({radiusNode.FieldName}, geography'POINT({radiusNode.Longitude} {radiusNode.Latitude})') le {radiusNode.Radius}{orderBy}"; return(queryText); }
protected virtual Sitecore.ContentSearch.Linq.Nodes.QueryNode VisitWithinRadius(WithinRadiusNode node, LuceneQueryOptimizerState mappingState) { return(new WithinRadiusNode(node.Field, node.Latitude, node.Longitude, node.Radius, mappingState.Boost)); }
/// <summary> /// The visit within radius. /// </summary> /// <param name="radiusNode"> /// The radius node. /// </param> /// <param name="state"> /// The state. /// </param> /// <returns> /// The <see cref="QueryNode"/>. /// </returns> private QueryNode VisitWithinRadius(WithinRadiusNode radiusNode, CloudQueryOptimizerState state) { return(new WithinRadiusNode(radiusNode.Latitude, radiusNode.Longitude, radiusNode.FieldName, radiusNode.Radius, radiusNode.DistanceSort, radiusNode.MaxResults)); }
private QueryNode VisitWithinRadius(WithinRadiusNode radiusNode, SolrQueryOptimizerState state) { return(new WithinRadiusNode(this.Visit(radiusNode.SourceNode, state), radiusNode.Field, radiusNode.Lat, radiusNode.Lon, radiusNode.Radius)); }