当前位置: 首页 > 知识库问答 >
问题:

如何返回距离和所有字段使用elasticsearch和Spring启动(springframework.data.elasticsearch)

姬高澹
2023-03-14

我找到了一种使用elasticsearch查询获取数据的方法。但我目前的问题是在spring boot查询中翻译它。

我的查询如下:

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "should": [
        {
          "constant_score": {
            "filter": {
              "term": {
                "my_field": "my_value"
              }
            },
            "boost": 10
          }
        },
        {
          "constant_score": {
            "filter": {
              "term": {
                "my_field": "my_value"
              }
            },
            "boost": 8
          }
        }
      ],
      "filter": [
        {
          "terms": {
            "my_array_field": [
              "first_value",
              "second_value"
            ]
          }
        },
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 40,
              "lon": 2
            }
          }
        }
      ]
    }
  },
  "script_fields": {
    "distance": {
      "script": "doc['location'].arcDistance(40, 2) / 1000"
    }
  },
  "_source": true,
  "sort": [
    {
      "_score": "desc"
    }
  ]
}

索引中存储的所有文档都有一个字段位置,其类型定义为地理点

我的问题是:

如何翻译脚本_字段,使用spring boot返回距离。

我目前的代码是:

BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQueryBuilder)
                .withPageable(PageRequest.of(page, size))
                .build();

elasticsearchOperations.search(nativeSearchQuery, MyIndexedDocument.class);

我试图从这里使用ScriptField,并在这里看到了一个示例,但目前还没有找到任何解决方案。

  1. 我该怎么用?
  2. 如果认为,在找到如何返回距离后,我必须精确到我的查询,我希望返回所有的_source字段。是否可以使用NativeSearchQuery来精确它?

共有2个答案

仇飞鹏
2023-03-14

您可以使用注释@脚本字段

阮阳曦
2023-03-14

作为一种解决办法

如果有人有更好的答案,我会在没有任何有效答案的情况下回答这个问题。

如果这是一个与某人相关的问题,我最终选择使用地理距离排序来处理距离返回。

查询是这样的:

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "should": [
        {
          "constant_score": {
            "filter": {
              "term": {
                "my_field": "my_value"
              }
            },
            "boost": 10
          }
        },
        {
          "constant_score": {
            "filter": {
              "term": {
                "my_field": "my_value"
              }
            },
            "boost": 8
          }
        }
      ],
      "filter": [
        {
          "terms": {
            "my_array_field": [
              "first_value",
              "second_value"
            ]
          }
        },
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 40,
              "lon": 2
            }
          }
        }
      ]
    }
  },
    "sort" : [
        { "_score": "desc"},{
      "_geo_distance": {
        "location": {
                      "lat": 40,
                      "lon": 2
        },
        "order": "asc",
        "unit": "km",
        "mode": "min",
        "distance_type": "arc",
        "ignore_unmapped": true
      }
    }
   ]
}

所以我可以得到我的距离作为回报,但不是作为一个内容领域,而是作为SortValue中的一个值

使用spring数据elasticsearch:

BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
ScoreSortBuilder scoreSortBuilder = new ScoreSortBuilder();
GeoDistanceSortBuilder geoDistanceSortBuilder = new GeoDistanceSortBuilder("location", Double.parseDouble(location.getLatitude()), Double.parseDouble(location.getLongitude()));
geoDistanceSortBuilder.unit(DistanceUnit.KILOMETERS);
geoDistanceSortBuilder.ignoreUnmapped(true);
geoDistanceSortBuilder.sortMode(SortMode.MIN);
geoDistanceSortBuilder.order(SortOrder.ASC);

NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQueryBuilder)
                .withPageable(PageRequest.of(page, size))
                .withSort(scoreSortBuilder)
                .withSort(geoDistanceSortBuilder)
                .build();

elasticsearchOperations.search(nativeSearchQuery, MyIndexedDocument.class);

 类似资料:
  • 问题内容: 使用elasticsearch,我试图将计算出的字段添加到地理搜索中。我只想在搜索文档中附加一个额外的计算字段,但是当我通过“ script_fields”添加计算字段时,仅返回该字段。 我尝试添加通配符字段部分,但它不会影响结果。 如何使此查询返回添加了额外计算字段的? 问题答案: 不建议检索字段,而应使用源过滤。 所以,代替这个 用这个:

  • 问题内容: 简而言之,当不使用_geo_distance排序时,是否有一种方法可以返回地理距离? 更新:为澄清起见,我希望结果按随机顺序排列并包含距离。 问题答案: 是的,您可以使用脚本字段。 例如,假设您的文档具有一个名为的地理位置字段,则可以使用以下内容: (请注意,只是一个转义的单引号,所以真的是) 如果还希望返回该字段,则可以如下指定:

  • 问题内容: 我实现了一个脚本字段,该字段返回的距离如下所示:Elasticsearch结果中的返回距离? Ruby: 但是返回的距离不正确。如果该点很近,则距离会更正确,但是随着距离的增加,它会变得越来越不正确。 似乎无法弄清楚我在做什么。 问题答案: distanceInKm()将距离计算为平面上的点,该速度很快但不太准确。尝试改用arcDistanceInKm()。

  • 我正在使用ElasticSearch 7.3来查询一些文档, 我想在查询响应中只返回每个文档的特定字段, 我发现可以使用来实现这一点, 我可以从Kibana使用这个查询来实现这一点- 返回给我正确的数据- 但我无法使用ElasticSearch的节点客户端实现同样的功能- 有人能帮我找到正确的方法来实现我的用例吗? 引用- https://www.elastic.co/guide/en/elast

  • 我有下面的代码使用C#.NET 4.5和NEST 2.0通过nuget。此查询总是返回我的类型'trackpoint',其中包含具有此距离搜索代码的文档总数。我有2790份文件,计数返回仅此而已。即使以1厘米为距离单位,它也会返回所有2790份文件。我的“跟踪点”类型有一个位置字段、geo_point类型、gehash true和geohash_precision9。 我只是尝试根据距离过滤结果,

  • 问题内容: 我已经在带有Elasticsearch-Spark连接器的火花壳中进行了一些实验。调用火花: 在scala shell中: 它运作良好,结果包含myquery中指定的良好记录。唯一的事情是,即使我在查询中指定了这些字段的子集,我也获得了所有字段。例: 返回所有字段,不仅返回a和b(顺便说一句,我注意到大小参数都不考虑在内:result包含10条以上的记录)。也许添加字段是嵌套的很重要,