コード例 #1
0
        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);
        }