SolrNet空间搜索 - 对geodist进行排序()

时间:2012-07-19 08:28:41

标签: c# solr solrnet

我正在使用Solr(3.6.0)与SolrNet(0.4),我正在寻找SolrNet中空间搜索的一些帮助 - 特别是按距离对结果进行排序。

这是我的疑问:

var postcode = new SolrQueryByField("Postcode", fields[13]);
var distance = new SolrQueryByDistance("LatLong", latitude, longitude, 1);
QueryOptions options = new QueryOptions();
options.Rows = 25;
options.AddFilterQueries(distance);

我尝试过显而易见的事情:

options.OrderBy = new List<SortOrder> { new SortOrder("geodist()", Order.ASC)};

options.OrderBy = new List<SortOrder> { SortOrder.Parse("geodist() asc") };

作为最后的尝试,我尝试将过滤查询与排序一起定义为额外的参数:

options.ExtraParams = new Dictionary<string, string>
{
    {"d", "1"},                        
    {"sField", "LatLong"},
    {"pt", latitudeString + "," + longitudeString},
    {"fq", "{!geofilt}"},
    {"sort", "geodist() asc"}
};

但一切都会导致:

SEVERE: org.apache.solr.common.SolrException: can not sort on unindexed field: geodist()

我也尝试将lat,long和distance参数传递给geodist()函数,但无济于事。

我能够手工构建这个查询,而不是通过SolrNet!似乎问题与查询字符串的排序和括号方式有关。

这是有效的(手工构建):

{d = 1&安培;排序= geodist()+ ASC&安培;元数=的LatLong&安培;版本= 2.2&安培;行数= 25安培; Q =邮编: “LN1 + 2EB” &安培; PT = 52.1,-1.11&安培; FQ = {!geofilt}}

失败(由SolrNet构建):

{d = 1&安培;排序= geodist()+ ASC&安培; Q =(邮编: “LN1 + 2EB”)!&安培;元数=的LatLong&安培; PT = 53.289186,-0.705095&安培; FQ = {geofilt}&安培;行= 25&安培;版本= 2.2}

我认为我做的事情很傻;必须有办法使这个功能工作!任何指针都会非常感激。

1 个答案:

答案 0 :(得分:1)

这将按距离排序您的结果。取消注释行也可以过滤距离点的距离。

solr.Query(SolrQuery.All,
                              new QueryOptions
                                  {
                                      FilterQueries = filterQueries.ToArray(), // add filter items
                                      OrderBy = new[] { new SolrNet.SortOrder("geodist()", Order.ASC) },
                                      ExtraParams = new Dictionary<string, string>
                                          {
                                              // uncomment for filtering by distance
                                              //{"fq", "{!geofilt}"},
                                              //{"d", distance.ToString(CultureInfo.InvariantCulture)} replace distance with your radius filter
                                              {"sfield", "lat_long"}, // replace lat_long with your field in solr that stores the lat long values
                                              {"pt", "-33.858727,151.213199"}, // this is the point of reference
                                                                                        }
                                  });