如何使用 elasticsearch 和 spring-boot (springframework.data.elasticsearch) return 距离和所有字段

How to return distance and all fields using elasticsearch and spring-boot (springframework.data.elasticsearch)

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

我的查询如下:

{
  "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"
    }
  ]
}

索引中存储的所有文档都有一个字段 location,类型定义为 geo_point

我的问题是:

如何使用 spring-boot.return 翻译 script_fields,这是 return 告诉我的距离。

我当前的代码是:

BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();

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

elasticsearchOperations.search(nativeSearchQuery, MyIndexedDocument.class);

我尝试使用 here and saw an example here 中的 ScriptField,但目前没有找到任何解决方案。

  1. 我该如何使用它?
  2. 如果认为,在找到如何 return 距离之后,我将不得不精确地查询我想要 return 中的所有 _source 字段。是否可以使用 NativeSearchQuery 来精确它?

解决方法

如果有人有更好的答案,我会在没有任何经过验证的答案的情况下提出问题。

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

查询是这样的:

{
  "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
      }
    }
   ]
}

所以我可以在 return 中获取我的距离,但不是作为 content 的字段,而是作为 sortvalues[=30] 中的值=]

使用spring数据弹性搜索:

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);

您可以使用注解@ScriptedField