Lucene.Net 3.0.3空间搜索 [英] Lucene.Net 3.0.3 Spatial search

查看:94
本文介绍了Lucene.Net 3.0.3空间搜索的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am a newcomer to Lucene.Net. I started trying to use spatial searches with Lucene.Net 3.0.3 release.

有人可以通过一个简单的演示项目来帮助我了解它的工作原理吗? 谢谢,将不胜感激.

Could someone have a simple demo project that can help me to understand how it works? Thank you, that would be very appreciated.

推荐答案

今天开始进行空间搜索.下面是核心SearchByLocation方法:

Just got spatial search working today. Below is the core SearchByLocation method:

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个类以及一个测试(示例使用)类.我认为在此处发布整个解决方案是没有道理的.

The basic example works with Lucene.NET 3.0.3 and consists of 3 classes plus a test (example use) class. I don't think it makes sense to post the whole solution here.

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

The key part which drives the spatial search is this:

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).

You can get the entire solution (VS2015) on GitHub.

如果您有任何问题,请告诉我,我们将尽力帮助或改善答案.

Let me know if you have any questions and I'll try to help or improve the answer.

这篇关于Lucene.Net 3.0.3空间搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆