【问题标题】:How can you set a floor to the gaussian decay function in ElasticSearch?如何为 ElasticSearch 中的高斯衰减函数设置底限?
【发布时间】:2016-03-31 12:40:02
【问题描述】:

我正在尝试使用 Elastic Search 来存储地理空间数据。但是,我希望相关性分数是与点的距离和基于文本匹配查询的相关性的组合。例如,假设查询是Yellowstone National Park,但来源在芝加哥。芝加哥的Portage Park 更有可能匹配,因为对于任何合理的距离和衰减,因为Yellowstone National Park 的衰减分数接近于零并且根本不会出现在结果中。我想做的是在衰减分数上有一个 FLOOR,这样超过一定距离,所有结果看起来都一样。

例如,这是我的 Java 代码:

      queryBuilder = new FunctionScoreQueryBuilder(queryBuilder).add(
      ScoreFunctionBuilders.gaussDecayFunction("search_geo_point", point.get(), "10km")
          .setDecay(0.75)
          .setOffset("5km"));

我想做的是将距离原点大于 30 公里的所有点视为相同,并且衰减函数不再降低超过该点的分数。这可能吗?问题是,超过一定距离,衰减函数会大大降低相关性,即使查询与文本字段完全匹配,它也不会出现在结果中。

【问题讨论】:

    标签: java elasticsearch


    【解决方案1】:

    我不知道在 Elasticsearch 的函数分数中实现的功能,虽然它会非常方便。

    但是,您可以通过使用function query 中的过滤子句通过一个小变通方法来实现您的目标:

    POST test/parks/_search
    {
      "query": {
        "function_score": {
          "query": {
            "match": {
              "name": "Yellowstone National park"
            }
          },
          "functions": [
            {
              "gauss": {
                "location": {
                  "origin": "41.4881832, -87.623177",
                  "scale": "10km",
                  "offset": "5km"
                }
              },
              "filter": {
                "geo_distance_range": {
                  "from": "0km",
                  "to": "30km",
                  "location": {
                    "lat": 41.881832,
                    "lon": -87.623177
                  },
                  "include_upper": false
                }
              }
            },
            {
              "weight": ## Set appropriate weight,
              "filter": {
                "geo_distance_range": {
                  "from": "30km",
                  "location": {
                    "lat": 41.881832,
                    "lon": -87.623177
                  },
                  "include_lower": true
                }
              }
            }
          ]
        }
      }
    }
    

    通过上面的查询,您只将高斯函数分数应用于 30km 范围内的命中。在第二个过滤器子句中,您为更远的所有命中定义一个恒定分数。 请注意,您应该适当地设置 include_upper 和 include_lower 以防止多次对同一元素进行评分。

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2015-03-08
      相关资源
      最近更新 更多