实现步骤:
1、定义属性
    [Serializable]
    public class Coordinate
    {
        public double Lat { get; set; }
 
        public double Lon { get; set; }
    }
 
        /// <summary>
        /// 位置坐标
        /// </summary>
        [ElasticProperty(Type = FieldType.GeoPoint)]
        public Coordinate location { get; set; }
 
        /// <summary>
        /// 返回字段,距离值,适用于地理位置检索和排序  2016-03-25
        /// </summary>
        public double distance { get; set; }
 

 
2、创建索引时,设置Mapping:
_clientES.CreateIndex(indexName, s => s.AddMapping<DTOCarInfoIndexField>(f => f.MapFromAttributes().Properties(p => p.GeoPoint(g => g.Name(n => n.location).IndexLatLon()).String(fullinfo => fullinfo.Name(n => n.fullinfo).Index(FieldIndexOption.Analyzed).Analyzer("ik").Store(false)).String(description => description.Name(n => n.statedescription).Index(FieldIndexOption.Analyzed).Analyzer("ik").Store(false))).AllField(af => af.Enabled(false))).NumberOfReplicas(0));
 

 
3、向ES写入数据时,给location属性赋值:
 
#region 车源坐标  2015-11-30
 
string[] arrValue = ConvertHelper.ToStringArray(value.ToString(), ',');
if (arrValue.Length == 2)
{
    var point = new Coordinate();
    point.Lat = 0.0;
    point.Lon = 0.0;
    double x = ConvertHelper.ToDouble(arrValue[0]);
    double y = ConvertHelper.ToDouble(arrValue[1]);
    if (x > 0 && y > 0)
    {
        point.Lat = x;
        point.Lon = y;
    }
    prop.SetValue(obj, point, null);
}
 
#endregion
 

 
4、搜索过程中按照距离排序并返回距离值(单位:km)(Nest组件):
//构建排序对象
List<KeyValuePair<PropertyPathMarker, ISort>> oneSortList = new List<KeyValuePair<PropertyPathMarker, ISort>>();
SortOrder ordertype = SortOrder.Ascending;
GeoDistanceSort sort = new GeoDistanceSort();
sort.Field = "location";
sort.Order = ordertype;
sort.GeoUnit = GeoUnit.Kilometers;
sort.PinLocation = locationpoint;
oneSortList.Add(new KeyValuePair<PropertyPathMarker, ISort>("_geo_distance", sort));
 
//构建ES检索对象
string[] returnFields=new[]{"id","distance"};
var searchRequest = new SearchRequest();
searchRequest.From = 0;
searchRequest.Size = 20;
searchRequest.Sort = oneSortList;
 
//定义返回列属性
searchRequest.Fields = returnFields.Select(f => (PropertyPathMarker)f.ToLower()).ToList();
 
//添加其他检索条件
//searchRequest.Query = queryList[i];
//searchRequest.Filter = listFilter[i];
 
 
#region 地理检索,添加距离返回值字段
 
if (!string.IsNullOrEmpty(locationPoint) && returnFields.Contains("distance"))
{
    var distancefield = new Dictionary<string, IScriptFilter>();
    var tempfield = new ScriptFilter();
    tempfield.Params = new Dictionary<string, object>();
    tempfield.Params.Add("lat", 116.403951);
    tempfield.Params.Add("lon", 39.915031);
    tempfield.Script = "doc['location'].arcDistanceInKm(lat,lon)";
    distancefield.Add("distance", tempfield);
    searchRequest.ScriptFields = distancefield;
}
 
#endregion
 
//执行检索,获取返回值
var resultSearch = esClient.Search<T>(searchRequest);
foreach (var doc in sResponse.FieldSelections)
{
    var id = doc.FieldValues<object[]>("id").ToList()[0];
    var distancevalue = doc.FieldValues<object[]>("distance").ToList()[0]; 
}
 
 
5、搜索过程中按照距离排序并返回距离值(单位:km)(Linq方式)
ESClient.Instance_TaocheCar().GetElasticClient().Search<DTOCarInfoIndexField>(s => s.From(0).Size(200).Fields(arrField).Filter(filter => filter.Terms("userid", list)).ScriptFields(sf => sf.Add("distance", descriptor => descriptor.Params(p => p.Add("lat", lat).Add("lon", lon)).Script("doc['location'].arcDistanceInKm(lat,lon)"))).SortGeoDistance(sg => sg.OnField("location").PinTo(lat, lon).Unit(GeoUnit.Kilometers).Ascending()));

基于Elasticsearch进行地理检索,计算距离值的更多相关文章

  1. 百度词汇检索,计算PMI值

    '''词汇检索百度返回值,并且计算PMI值的类''' from bs4 import BeautifulSoup import requests import re import pandas as ...

  2. Improving Commonsense Question Answering by Graph-based Iterative Retrieval over Multiple Knowledge Sources —— 基于多知识库迭代检索的常识问答系统

    基于多知识库迭代检索的问答系统 论文地址 背景 常识问答任务需要引入外部知识来帮助模型更好地理解自然语言问题,现有的解决方案大都采用两阶段框架: 第一阶段 -- 从广泛的知识来源中找到与给定问题相关的 ...

  3. 基于Elasticsearch开发时的注意事项备忘

    记录一些自己在Elasticsearch开发过程的琐碎知识点 1.使用ScriptFields时,需在yml配置文件中添加配置(script.disable_dynamic: false)开启动态脚本 ...

  4. geotrellis使用(十七)使用缓冲区分析的方式解决单瓦片计算边缘值问题

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 需求分析 实现方案 总结 一.前言        最 ...

  5. 蓝牙RSSI计算距离

    利用CoreLocation.framework很容易扫描获得周边蓝牙设备,苹果开源代码AirLocate有具体实现,下载地址: https://developer.apple.com/library ...

  6. java工具类(六)根据经纬度计算距离

    Java实现根据经纬度计算距离 在项目开发过程中,需要根据两地经纬度坐标计算两地间距离,所用的工具类如下: Demo1: public static double getDistatce(double ...

  7. 使用不同的方法计算TF-IDF值

    摘要 这篇文章主要介绍了计算TF-IDF的不同方法实现,主要有三种方法: 用gensim库来计算tfidf值 用sklearn库来计算tfidf值 用python手动实现tfidf的计算 总结 之所以 ...

  8. 通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ

    通过经纬度坐标计算距离的方法(经纬度距离计算) 最近在网上搜索“通过经纬度坐标计算距离的方法”,发现网上大部分都是如下的代码: #define PI 3.14159265 static double ...

  9. 根据经纬度坐标计算距离-python

    一.两个坐标之间距离计算 参考链接: python实现 1.Python 根据地址获取经纬度及求距离 2.python利用地图两个点的经纬度计算两点间距离 LBS 球面距离公式 美团app筛选“离我最 ...

随机推荐

  1. 处理程序“WebServiceHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

    开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示“处理程序“PageHandlerFactory-I ...

  2. 多XML追加操作

    假设要统计当前系统中所有的试卷进行分析,试卷是以XML格式存储的,所有这就需要将所有零散的XML文件整合起来,处理成一个完整的XML文件,进行分析, 下面是简单额处理方法: 当前XML文件格式: &l ...

  3. ButterKnife的简单使用

    刚刚学习Android,也不知道算不算已经入门!但是总感觉自己没有什么提高,所以就把一些学习内容写一遍下来. 今天接触了ButterKnife这个第三方框架 GitHub地址:https://gith ...

  4. 用ipad维护Linux服务器

    用ipad维护Linux服务器 随着移动办公的应用深入,越来越多的ITer开始使用ipad来工作学习和娱乐,有时当你接到紧急求救电话,需要你维护服务器时,怎么办?拿着ipad接入到wifi网络就能连接 ...

  5. tool debug Android phonegap app

    phonegap debug 最近发现了一个可以调试phonegap的工具  在Google浏览器上调试Android真机的APP  这是好啊!!!跟Mac上的Safari 浏览器一样调试iOS 的A ...

  6. 如何解决SWAT模型数据移动目录后出现的“SWAT2005.mdb database specified in your MasterProgress table does not exists. Please correct and try again”的问题

    方法: 1.用MS Access软件打开SWAT模型工程文件的数据文件,如“**流域模拟.mdb”,该文件一般存放在工程文件“**流域模拟.mxd”相同的路径: 2.打开以后,找到“MasterPro ...

  7. [转]常用电器认证标志 && 手机频段

    一个手电筒就可以算得上一件家用电器的时代已经过去了,现在,谁家里不得有个几件?大家肯定看到了这些电器上贴的各种各样的认证标志了吧?看的人是眼花缭乱,目不暇接,更有一些是“洋认证”.下面罗列出一些常见的 ...

  8. hadoop 根据SecondaryNameNode恢复Namenode

    1.修改conf/core-site.xml 增加 <property> <name>fs.checkpoint.period</name> <value&g ...

  9. 无DLL远程注入

    界面如下: 主要代码如下: #define STRLEN 20 typedef struct _DATA { DWORD dwLoadLibrary; DWORD dwGetProcAddress; ...

  10. C++ STL 简单记录

    1,STL提供三种类型的组件:容器.迭代器.算法. 容器: 顺序容器(vector.list.deque.string等)是一系列元素的有序集合: 关联容器(set.multiset.map.mult ...