转载自:http://outofmemory.cn/code-snippet/12044/solr-gis-location
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="name" type="text" indexed="true" stored="true"/> <field name="loc" type="location" indexed="true" stored="true"/> <dynamicField name="*_coordinate" type="double" indexed="true" stored="false" />
我们需要定义 location 字段类型,如下所示:
<fieldType name="location" subFieldSuffix="_coordinate"/>
再假设我们有以下索引数据
<add> <doc> <field name="id">1</field> <field name="name">Company 1</field> <field name="loc">56.4,40.2</field> </doc> <doc> <field name="id">2</field> <field name="name">Company 2</field> <field name="loc">50.1,48.9</field> </doc> <doc> <field name="id">3</field> <field name="name">Company 3</field> <field name="loc">23.18,39.1</field> </doc> </add>
现在可以通过以下语句查询到名称中匹配 company 的公司 q=name:company&fl=*
假设我们已经获得了客户端位置是 50.0, 28.0,然后我们打算在公司结果列表中显示客户端跟这些公司的距离。这时我们需要将以下参数加载 fl 中:
dist:geodist(loc,50.0,28.0)
这样整个查询看起来像这样:
q=name:company&fl=*,dist:geodist(loc,50.0,28.0)
查询返回的内容如下所示:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> <lst name="params"> <str name="q">name:company</str> <str name="fl">*,dist:geodist(loc,50.0,28.0)</str> </lst> </lst> <result name="response" numFound="3" start="0"> <doc> <str name="id">1</str> <str name="name">Company 1</str> <str name="loc">56.4,40.2</str> <double name="dist">1077.4200268973314</double> </doc> <doc> <str name="id">2</str> <str name="name">Company 2</str> <str name="loc">50.1,48.9</str> <double name="dist">1487.4260767512278</double> </doc> <doc> <str name="id">3</str> <str name="name">Company 3</str> <str name="loc">23.18,39.1</str> <double name="dist">3134.746384852772</double> </doc> </result> </response>
上面结果中 dist 就是客户要的距离字段。