• 在结果中返回函数值


    假设你有一个服务,你的用户可以搜索不同的公司,用户输入一个简单的关键字,可以返回匹配关键字的公司,但是有一天,用户要求返回的公司列表中可以显示公司跟用户的距离,这是该怎么做呢?

    准备工作

    在开始之前,需要先了解字段别名功能,具体可以参看这里

    怎么做

    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 就是客户要的距离字段。

  • 相关阅读:
    PHP 使用命名空间(namespace),实现自动加载
    快捷方式不能使用的解决方法
    Python学习案例
    Linux下Tomcat的安装和部署
    关于Linux下的环境变量
    关于Linux下安装Oracle
    Linux下安装MySQLdb模块(Python)
    交换机VLAN的定义、意义以及划分方式
    让java程序在后台一直执行(例如putty关闭后后台程序继续运行)
    基于FTP服务器搭建yum源
  • 原文地址:https://www.cnblogs.com/daichangya/p/12958487.html
Copyright © 2020-2023  润新知