文章来源:http://blog.csdn.net/awj3584/article/details/27795119
假设你有一个服务,你的用户可以搜索不同的公司,用户输入一个简单的关键字,可以返回匹配关键字的公司,但是有一天,用户要求返回的公司列表中可以显示公司跟用户的距离,这是该怎么做呢?
1.假设我们在 schema.xml 中定义了如下索引结构:
- <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"/>
2.我们需要定义 location 字段类型,如下所示:
- <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/>
3.再假设我们有以下索引数据
- <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>
PS:loc是“纬度,经度”,别写反了。
4.现在可以通过以下语句查询到名称中匹配 company 的公司
1
|
q=name:company&fl=*
|
5.假设我们已经获得了客户端位置是 50.0, 28.0,然后我们打算在公司结果列表中显示客户端跟这些公司的距离。这时我们需要将以下参数加载 fl 中:
1
|
dist:geodist(loc,50.0,28.0)
|
这样整个查询看起来像这样:
1
|
q=name:company&fl=*,dist:geodist(loc,50.0,28.0)
|
查询返回的内容如下所示:
- <?xmlversionxmlversion="1.0"encoding="UTF-8"?>
- <response>
- <lstnamelstname="responseHeader">
- <intnameintname="status">0</int>
- <intnameintname="QTime">0</int>
- <lstnamelstname="params">
- <strnamestrname="q">name:company</str>
- <strnamestrname="fl">*,dist:geodist(loc,50.0,28.0)</str>
- </lst>
- </lst>
- <resultnameresultname="response"numFound="3"start="0">
- <doc>
- <strnamestrname="id">1</str>
- <strnamestrname="name">Company 1</str>
- <strnamestrname="loc">56.4,40.2</str>
- <doublenamedoublename="dist">1077.4200268973314</double>
- </doc>
- <doc>
- <strnamestrname="id">2</str>
- <strnamestrname="name">Company 2</str>
- <strnamestrname="loc">50.1,48.9</str>
- <doublenamedoublename="dist">1487.4260767512278</double>
- </doc>
- <doc>
- <strnamestrname="id">3</str>
- <strnamestrname="name">Company 3</str>
- <strnamestrname="loc">23.18,39.1</str>
- <doublenamedoublename="dist">3134.746384852772</double>
- </doc>
- </result>
- </response>