我是 Lucene.Net 的新手。我开始尝试在 Lucene.Net 3.0.3 版本中使用空间搜索。
有人可以有一个简单的演示项目来帮助我理解它是如何工作的吗?谢谢,那将不胜感激。
我是 Lucene.Net 的新手。我开始尝试在 Lucene.Net 3.0.3 版本中使用空间搜索。
有人可以有一个简单的演示项目来帮助我理解它是如何工作的吗?谢谢,那将不胜感激。
今天刚刚开始空间搜索。下面是核心SearchByLocation
方法:
public IList<SearchItem> SearchByLocation(string queryString, double longitude, double latitude, double searchRadiusKm, int maxHits = 10)
{
IList<SearchItem> results;
using (var searcher = new IndexSearcher(Directory, true))
using (var analyser = new StandardAnalyzer(LuceneVersion))
{
var distance = DistanceUtils.Dist2Degrees(searchRadiusKm, DistanceUtils.EARTH_MEAN_RADIUS_KM);
var searchArea = _spatialContext.MakeCircle(longitude, latitude, distance);
var fields = new[] {Name};
var parser = new MultiFieldQueryParser(LuceneVersion, fields, analyser);
parser.DefaultOperator = QueryParser.Operator.OR; // Allow multiple terms.
var query = ParseQuery(queryString, parser);
var spatialArgs = new SpatialArgs(SpatialOperation.Intersects, searchArea);
var spatialQuery = _strategy.MakeQuery(spatialArgs);
var valueSource = _strategy.MakeRecipDistanceValueSource(searchArea);
var valueSourceFilter = new ValueSourceFilter(new QueryWrapperFilter(spatialQuery), valueSource, 0, 1);
var filteredSpatial = new FilteredQuery(query, valueSourceFilter);
var spatialRankingQuery = new FunctionQuery(valueSource);
var bq = new BooleanQuery();
bq.Add(filteredSpatial,Occur.MUST);
bq.Add(spatialRankingQuery,Occur.MUST);
var hits = searcher.Search(bq, maxHits).ScoreDocs;
results = MapResultsToSearchItems(hits, searcher);
}
return results;
}
基本示例使用Lucene.NET 3.0.3
并由 3 个类和一个测试(示例使用)类组成。我认为在这里发布整个解决方案没有意义。
驱动空间搜索的关键部分是:
var spatialArgs = new SpatialArgs(SpatialOperation.Intersects, searchArea);
var spatialQuery = _strategy.MakeQuery(spatialArgs);
var valueSource = _strategy.MakeRecipDistanceValueSource(searchArea);
var valueSourceFilter = new ValueSourceFilter(new QueryWrapperFilter(spatialQuery), valueSource, 0, 1);
var filteredSpatial = new FilteredQuery(query, valueSourceFilter);
var spatialRankingQuery = new FunctionQuery(valueSource);
var bq = new BooleanQuery();
bq.Add(filteredSpatial,Occur.MUST);
bq.Add(spatialRankingQuery,Occur.MUST);
您可以在GitHub 上获得整个解决方案(VS2015)。
如果您有任何问题,请告诉我,我会尽力帮助或改进答案。
我今天早上发布了一个要点。 https://gist.github.com/Mark-Broadhurst/8931898
它应该让你前进。请注意,它还没有按距离排序(仍在研究中)。