首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene.Net 3.0.3空间搜索

Lucene.Net 3.0.3空间搜索
EN

Stack Overflow用户
提问于 2013-09-11 14:49:52
回答 2查看 1.6K关注 0票数 3

我是Lucene.Net的新手。我开始尝试在Lucene.Net 3.0.3版本中使用空间搜索。

谁能有一个简单的演示项目,可以帮助我理解它是如何工作的?谢谢,那将是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2016-02-28 03:12:17

今天才开始用空间搜索。下面是核心SearchByLocation方法:

代码语言:javascript
复制
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个类加上一个测试(示例使用)类组成。我不认为在这里发布整个解决方案是有意义的。

驱动空间搜索的关键部分是:

代码语言:javascript
复制
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)。

如果你有任何问题,请告诉我,我会尽力帮助或改进答案。

票数 3
EN

Stack Overflow用户

发布于 2014-02-11 21:03:07

我今天早上发了一篇文章。https://gist.github.com/Mark-Broadhurst/8931898

它应该能让你振作起来。请注意,它还没有按距离排序(仍在努力)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18734470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档