假设你有一个服务,你的用户可以搜索不同的公司,用户输入一个简单的关键字,可以返回匹配关键字的公司,但是有一天,用户要求返回的公司列表中可以显示公司跟用户的距离,这是该怎么做呢?
准备工作
在开始之前,需要先了解字段别名功能,具体可以参看这里
怎么做
1.假设我们在 schema.xml 中定义了如下索引结构:
1
2
3
4
5
6
|
<
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 字段类型,如下所示:
1
2
|
<
fieldType
name
=
"location"
class
=
"solr.LatLonType"
subFieldSuffix
=
"_coordinate"
/>
|
3.再假设我们有以下索引数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<
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
>
|
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)
|
查询返回的内容如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?
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
>
Chapter 4
153
<
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 就是客户要的距离字段。