gpt4 book ai didi

Lucene.Net 3.0.3 空间搜索

转载 作者:行者123 更新时间:2023-12-04 00:53:31 25 4
gpt4 key购买 nike

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

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

关于Lucene.Net 3.0.3 空间搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18734470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com