我正在使用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}
我认为我做的事情很傻;必须有办法使这个功能工作!任何指针都会非常感激。
答案 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
}
});