private static ScoreDoc[] Query(QueryDto queryDto) { var searcher = WebApiApplication.Searcher; GeoLocation geoLocation = GeoLocation.FromDegrees(queryDto.Latitude, queryDto.Longitude); GeoLocation[] bounds = geoLocation.BoundingCoordinates(queryDto.Radius); double latFrom = bounds[0].getLatitudeInDegrees(); double latTo = bounds[1].getLatitudeInDegrees(); double lngFrom = bounds[0].getLongitudeInDegrees(); double lngTo = bounds[1].getLongitudeInDegrees(); NumericRangeQuery <double> latQuery = NumericRangeQuery.NewDoubleRange("latitude", latFrom, latTo, true, true); latQuery.Boost = 1.5f; NumericRangeQuery <double> lngQuery = NumericRangeQuery.NewDoubleRange("longitude", lngFrom, lngTo, true, true); lngQuery.Boost = 1.5f; var query = new BooleanQuery { { latQuery, Occur.MUST }, { lngQuery, Occur.MUST } }; if (!string.IsNullOrEmpty(queryDto.Query)) { var standardAnalyzer = new StandardAnalyzer(Version.LUCENE_30); var innerQuery = new BooleanQuery { { new QueryParser(Version.LUCENE_30, "product_name", standardAnalyzer).Parse(queryDto.Query), Occur.SHOULD }, { new QueryParser(Version.LUCENE_30, "product_description", standardAnalyzer).Parse(queryDto.Query), Occur.SHOULD }, }; if (!queryDto.Query.Contains("~")) { Query q = new QueryParser(Version.LUCENE_30, "product_name", standardAnalyzer).Parse(queryDto.Query + "~"); q.Boost = 0.75f; innerQuery.Add(q, Occur.SHOULD); Query q2 = new QueryParser(Version.LUCENE_30, "product_description", standardAnalyzer).Parse(queryDto.Query + "~"); q2.Boost = 0.75f; innerQuery.Add(q2, Occur.SHOULD); } query.Add(innerQuery, Occur.MUST); } TopDocs topDocs = searcher.Search(query, 100); ScoreDoc[] hits = topDocs.ScoreDocs; return(hits); }