{"id":372,"date":"2026-06-05T16:23:33","date_gmt":"2026-06-05T08:23:33","guid":{"rendered":"https:\/\/larkdrop.cafe\/?p=372"},"modified":"2026-06-05T16:23:34","modified_gmt":"2026-06-05T08:23:34","slug":"spring-data-elasticsearch","status":"publish","type":"post","link":"https:\/\/larkdrop.cafe\/index.php\/2026\/06\/05\/spring-data-elasticsearch\/","title":{"rendered":"Spring Data Elasticsearch"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Spring Data Elasticsearch\u4e3a\u6587\u6863\u7684\u5b58\u50a8\uff0c\u67e5\u8be2\uff0c\u6392\u5e8f\u7b49\u64cd\u4f5c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u9ad8\u5ea6\u62bd\u8c61\u7684\u6a21\u677f\u3002\u4f7f\u7528Spring Data ElasticSearch\u6765\u64cd\u4f5cElasticsearch\uff0c\u53ef\u4ee5\u8f83\u5927\u7a0b\u5ea6\u7684\u51cf\u5c11\u6211\u4eec\u7684\u4ee3\u7801\u91cf\uff0c\u63d0\u9ad8\u6211\u4eec\u7684\u5f00\u53d1\u6548\u7387\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u6570\u636e\u51c6\u5907<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u4f7f\u7528Spring Data Elasticsearch\u4e4b\u524d\uff0c\u6211\u4eec\u5148\u51c6\u5907\u4e00\u4e9b\u6570\u636e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PUT serve_provider_info\n{\n  \"mappings\" : {\n      \"properties\" : {\n        \"acceptNum\" : {\n          \"type\" : \"integer\"\n        },\n        \"city\" : {\n          \"type\" : \"text\",\n          \"analyzer\": \"ik_max_word\",\n          \"search_analyzer\":\"ik_smart\"\n        },\n        \"id\" : {\n          \"type\" : \"long\"\n        },\n        \"location\" : {\n          \"type\" : \"geo_point\"\n        },\n        \"pickUp\" : {\n          \"type\" : \"integer\"\n        },\n        \"serveItemIds\" : {\n          \"type\" : \"long\"\n        },\n        \"serveTimes\" : {\n          \"type\" : \"long\"\n        },\n        \"settingStatus\" : {\n          \"type\" : \"long\"\n        }\n      }\n    }\n  \n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8be5\u7d22\u5f15\u7528\u6765\u5b58\u50a8\u5bb6\u653f\u670d\u52a1\u4ece\u4e1a\u8005\u7684\u4fe1\u606f\uff0c\u5305\u62ec:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>acceptance_num\uff1a\u5bb6\u653f\u670d\u52a1\u5de5\u4f5c\u4eba\u5458\u5f53\u524d\u7684\u63a5\u5355\u6570\u91cf<\/li>\n\n\n\n<li>city: \u5bb6\u653f\u670d\u52a1\u5de5\u4f5c\u4eba\u5458\u6240\u5728\u57ce\u5e02\u7684\u540d\u79f0<\/li>\n\n\n\n<li>location: \u5bb6\u653f\u670d\u52a1\u5de5\u4f5c\u4eba\u5458\u7684\u63a5\u5355\u5730\u70b9<\/li>\n\n\n\n<li>pick_up\uff1a\u5bb6\u653f\u670d\u52a1\u5de5\u4f5c\u4eba\u5458\u662f\u5426\u5f00\u542f\u4e86\u63a5\u5355<\/li>\n\n\n\n<li>serve_item_ids: \u5bb6\u653f\u670d\u52a1\u5de5\u4f5c\u4eba\u5458\u7684\u670d\u52a1\u9879id<\/li>\n\n\n\n<li>serve_times: \u5bb6\u653f\u670d\u52a1\u5de5\u4f5c\u4eba\u5458\u7684\u670d\u52a1\u7684\u670d\u52a1\u65f6\u95f4\u96c6\u5408\uff0c\u5f62\u59822025111209<\/li>\n\n\n\n<li>setting_status: \u5bb6\u653f\u670d\u52a1\u5de5\u4f5c\u4eba\u5458\u662f\u5426\u5b8c\u6210\u4e86\u5b9e\u540d\u8ba4\u8bc1<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u51c6\u5907\u4e00\u4e0b6\u6761\u6587\u6863\u6570\u636e\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# \u6b66\u660c\u533a\nPOST \/serve_provider_info\/_doc\/420001\n{\n  \"acceptNum\": 2,\n  \"city\": \"\u6b66\u6c49\u6b66\u660c\",\n  \"id\": 420001,\n  \"location\": \"30.5931,114.3054\",\n  \"pickUp\": 1,\n  \"serveItemIds\": &#91;101, 102, 105],\n  \"serveTimes\": &#91;2025111911, 2025111914, 2025111917],\n  \"settingStatus\": 1\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4e0a\u6d77\u9ec4\u57d4\u533a\nPOST \/serve_provider_info\/_doc\/310001\n{\n  \"acceptNum\": 7,\n  \"city\": \"\u4e0a\u6d77\u9ec4\u57d4\",\n  \"id\": 310001,\n  \"location\": \"31.2304,121.4737\",\n  \"pickUp\": 1,\n  \"serveItemIds\": &#91;101, 103, 107],\n  \"serveTimes\": &#91;2025111912, 2025111915],\n  \"settingStatus\": 1\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \u6b66\u6c49\u6c49\u9633\u533a\nPOST \/serve_provider_info\/_doc\/420002\n{\n  \"acceptNum\": 10,\n  \"city\": \"\u6b66\u6c49\u6c49\u9633\",\n  \"id\": 420002,\n  \"location\": \"30.5350,114.3528\",\n  \"pickUp\": 0,\n  \"serveItemIds\": &#91;102, 104],\n  \"serveTimes\": &#91;2025111913, 2025111916],\n  \"settingStatus\": 0\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \u5e7f\u5dde\u5929\u6cb3\u533a\nPOST \/serve_provider_info\/_doc\/440001\n{\n  \"acceptNum\": 3,\n  \"city\": \"\u5e7f\u5dde\u5929\u6cb3\",\n  \"id\": 440001,\n  \"location\": \"23.1291,113.2644\",\n  \"pickUp\": 1,\n  \"serveItemIds\": &#91;101, 102, 103, 105],\n  \"serveTimes\": &#91;2025111911, 2025111914, 2025111918],\n  \"settingStatus\": 1\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# \u6df1\u5733\u798f\u7530\u533a\nPOST \/serve_provider_info\/_doc\/440300\n{\n  \"acceptNum\": 9,\n  \"city\": \"\u6df1\u5733\u798f\u7530\",\n  \"id\": 440300,\n  \"location\": \"22.5431,114.0579\",\n  \"pickUp\": 1,\n  \"serveItemIds\": &#91;103, 106],\n  \"serveTimes\": &#91;2025111912, 2025111919],\n  \"settingStatus\": 1\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \u6b66\u6c49\u5e02\u6d2a\u5c71\u533a\nPOST \/serve_provider_info\/_doc\/420003\n{\n  \"acceptNum\": 8,\n  \"city\": \"\u6b66\u6c49\u6d2a\u5c71\",\n  \"id\": 420003,\n  \"location\": \"30.5728,114.2794\",\n  \"pickUp\": 1,\n  \"serveItemIds\": &#91;101, 104, 105],\n  \"serveTimes\": &#91;2025111913, 2025111915],\n  \"settingStatus\": 1\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5f00\u53d1\u73af\u5883\u51c6\u5907<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f15\u5165\u4f9d\u8d56<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!--spring-data-elasticsearch--&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-data-elasticsearch&lt;\/artifactId&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u6dfb\u52a0\u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spring:\n  elasticsearch:\n    # es server\u5730\u5740\n    uris: http:\/\/192.168.153.170:9200\n    # \u8fde\u63a5\u8d85\u65f6\u65f6\u95f4\n    connection-timeout: 6s\n    # \u8bbf\u95ee\u8d85\u65f6\u65f6\u95f4\n    socket-timeout: 10s<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9a\u4e49\u5b9e\u4f53\u7c7b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Document(indexName = \"serve_provider_info\")\n@Data\npublic class ServeProviderInfo {\n\n    @Id\n    private Long id;\n\n    @Field(type = FieldType.Integer)\n    private Integer acceptNum;\n\n    @Field(type = FieldType.Text, analyzer = \"ik_max_word\", searchAnalyzer = \"ik_smart\")\n    private String city;\n\n    @GeoPointField\n    private String location;\n\n    @Field(type = FieldType.Integer)\n    private Integer pickUp;\n\n    @Field(type = FieldType.Long)\n    private List&lt;Long&gt; serveItemIds;\n\n    @Field(type = FieldType.Integer)\n    private List&lt;Long&gt; serveTimes;\n\n    @Field(type = FieldType.Long)\n    private Long settingStatus;\n\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728ServeProviderInfo\u7c7b\u4e0a\uff0c\u901a\u8fc7\u6dfb\u52a0@Document\u6ce8\u89e3\uff0c\u6211\u4eec\u5c06ServeProviderInfo\u7c7b\u6620\u5c04\u7684\u6587\u6863\u6240\u5c5e\u7684\u7d22\u5f15\uff0c@Document\u6ce8\u89e3\u7684index\u5c5e\u6027\uff0c\u7528\u6765\u5b9a\u4e49\u5b9e\u4f53\u7c7b\u6240\u6620\u5c04\u7684\u6587\u6863\u6240\u5c5e\u7684\u76ee\u6807\u7d22\u5f15\u540d\u79f0<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728ServeProviderInfo\u7c7b\u7684\u6210\u5458\u53d8\u91cfId\u4e0a\u901a\u8fc7\u6dfb\u52a0@Id\u6ce8\u89e3\u6307\u5b9a\uff0cId\u6210\u5458\u53d8\u91cf\u6620\u5c04\u5230ServeProviderInfo\u7d22\u5f15\u4e2d\u6587\u6863\u7684id\u5b57\u6bb5\uff0c\u540c\u65f6\u4e5f\u6620\u5c04\u5230\u6587\u6863\u7684\u552f\u4e00\u8868\u793a_id\u5b57\u6bb5\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728ServeProviderInfo\u7c7b\u7684\u5176\u4ed6\u6210\u5458\u53d8\u91cf\u4e0a\uff0c\u901a\u8fc7\u6dfb\u52a0@Field\u6ce8\u89e3\uff0c\u5b9a\u4e49\u6210\u5458\u53d8\u91cf\u548c\u6587\u6863\u5b57\u6bb5\u7684\u6620\u5c04\u5173\u7cfb\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9ed8\u8ba4\u540c\u540d\u6210\u5458\u53d8\u91cf\uff0c\u6620\u5c04\u5230\u6587\u6863\u4e2d\u7684\u540c\u540d\u5b57\u6bb5(\u4e5f\u53ef\u4ee5\u7531@Field\u6ce8\u89e3\u7684name\u5c5e\u6027\u663e\u793a\u6307\u5b9a)<\/li>\n\n\n\n<li>\u901a\u8fc7@Field\u6ce8\u89e3\u7684type\u5c5e\u6027\u6307\u5b9a\u6587\u6863\u4e2d\u540c\u540d\u5b57\u6bb5\u7684\u6570\u636e\u7c7b\u578b<\/li>\n\n\n\n<li>\u901a\u8fc7@Field\u6ce8\u89e3\u7684analyzer\u5c5e\u6027\uff0c\u6307\u5b9a\u6210\u5458\u53d8\u91cf\u6240\u6620\u5c04\u7684\u6587\u6863\u5b57\u6bb5\u6240\u4f7f\u7528\u7684\u7684\u5206\u8bcd\u5668\uff0csearchAnalyzer\u8868\u793a\u67e5\u8be2\u65f6\u5bf9\u5173\u952e\u5b57\u6240\u4f7f\u7528\u7684\u5206\u8bcd\u5668<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\u6846\u67b6\u4f7f\u7528<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Spring Data Elasticsearch\u4e3b\u8981\u6709\u4e24\u79cd\u4f7f\u7528\u65b9\u5f0f\uff0c\u4e00\u79cd\u662f\u4f7f\u7528Repository\u63a5\u53e3\uff0c\u53e6\u5916\u4e00\u79cd\u662f\u9762\u5bf9\u590d\u6742\u573a\u666f\u65f6\u4f7f\u7528\u7684ElasticserchRestTemplate\u5bf9\u8c61<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Repository\u63a5\u53e3<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7c7b\u6bd4\u4e8eMybatis-Plus\u4e2d\u5b9a\u4e49BaseMaper\u5b50\u63a5\u53e3\u5373\u53ef\u5bf9\u5355\u8868\u505a\u589e\u5220\u6539\u67e5\u7684\u64cd\u4f5c\uff0cSpring Data Elastisearch\u4e2d\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5b9a\u4e49ElasticsearchRepository\u5b50\u63a5\u53e3\uff0c\u8fc5\u901f\u5b9e\u73b0\u5bf9\u7d22\u5f15\u4e2d\u7684\u6587\u6863\u6570\u636e\u7684\u589e\u5220\u6539\u67e5\uff0c\u4ee5\u53ca\u901a\u8fc7\u81ea\u5b9a\u4e49\u65b9\u6cd5\uff0c\u5b9e\u73b0\u81ea\u5b9a\u4e49\u67e5\u8be2\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface ServeProviderInfoRepository extends ElasticsearchRepository&lt;ServeProviderInfo, Long&gt; {\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">ElasticsearchRepository\u63a5\u53e3\u9700\u8981\u63a5\u6536\u4e24\u4e2a\u6cdb\u578b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7b2c\u4e00\u4e2a\u6cdb\u578b\u5373\u6620\u5c04\u5b9e\u4f53\u7c7b<\/li>\n\n\n\n<li>\u7b2c\u4e8c\u4e2a\u6cdb\u578b\u662f\u5728\u5b9e\u4f53\u7c7b\u4e2d\u52a0\u4e86@Id\u6ce8\u89e3\u7684\u6210\u5458\u53d8\u91cf\u7684\u6570\u636e\u7c7b\u578b\uff0c\u5373\u6620\u5c04\u5230\u6587\u6863\u552f\u4e00\u6807\u8bc6_id\u5b57\u6bb5\u7684\u6210\u5458\u53d8\u91cf\u7c7b\u578b\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u65e6\u6211\u4eec\u5b9a\u4e49\u597d\u4e86ElasticsearchRepository\u7684\u5b50\u63a5\u53e3\uff0c\u9a6c\u4e0a\u5c31\u53ef\u4ee5\u5b9e\u73b0\u5bf9goods\u7d22\u5f15\u4e2d\u6587\u6863\u7684\u589e\u5220\u6539\u67e5\u529f\u80fd<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/\/ \u6ce8\u5165repository\u5bf9\u8c61\n    @Autowired\n    private ServeProviderInfoRepository providerRepository;\n\n    \n    \/\/ \u4fdd\u5b58\u5355\u4e2a\u6587\u6863\u5bf9\u8c61\n    ServeProviderInfo providerInfo = ....\n    providerRepository.save(providerInfo);\n\n\n\n    \/\/ \u6279\u91cf\u4fdd\u5b58\u591a\u4e2a\u6587\u6863\u5bf9\u8c61\n    List&lt;ServeProviderInfo&gt; providerInfoList = ...\n    goodsRepository.saveAll(providerInfoList);\n\n   \/\/ \u6839\u636eid\u67e5\u8be2\n   providerRepository.findById(id);\n\n   \/\/ \u6839\u636eid\u5220\u9664\n   providerRepository.deleteById(id);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u540c\u65f6\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u6ce8\u610f\u4e00\u70b9\uff0c\u4e00\u65e6\u6211\u4eec\u5b9a\u4e49\u597d\u4e86ElasticsearchRepository\u63a5\u53e3\uff0c\u800c\u4e14\u88abSpringBoot\u542f\u52a8\u7c7b\u626b\u63cf\u5230\uff0c\u90a3\u4e48\u5728\u5e94\u7528<strong>\u542f\u52a8<\/strong>\u7684\u65f6\u5019\uff0c\u5982\u679cElasticsearchRepository\u5b50\u63a5\u53e3\u6240\u8bbf\u95ee\u7684\u7d22\u5f15\u5728ES\u4e2d\u4e0d\u5b58\u5728\uff0cSpring Data Elasticsearch\u4f1a\u5728ES\u4e2d<strong>\u81ea\u52a8\u521b\u5efa\u7d22\u5f15\uff0c\u5e76\u6839\u636e\u6620\u5c04\u5b9e\u4f53\u7c7b\u5b9a\u4e49\u7d22\u5f15\u7684\u6620\u5c04<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u867d\u7136Repository\u63a5\u53e3\u4e2d\u63d0\u4f9b\u4e86\u4e00\u4e9b\u57fa\u672c\u7684\u589e\u5220\u6539\u67e5\u65b9\u6cd5\uff0c\u4f46\u662f\u5927\u591a\u6570\u65f6\u5019\uff0c\u6211\u4eec\u53ef\u80fd\u9700\u8981\u5bf9\u7d22\u5f15\u4e2d\u7684\u6587\u6863\u6570\u636e\u505a\u81ea\u5b9a\u4e49\u67e5\u8be2\uff0c\u6b64\u65f6\u4ec5\u4ec5\u4f7f\u7528ElasticsearchRepository\u63a5\u53e3\u4e2d\u7ee7\u627f\u7684\u65b9\u6cd5\u65e0\u6cd5\u6ee1\u8db3\u6211\u4eec\u7684\u9700\u6c42\u3002\u6b64\u65f6\u6211\u4eec\u5c31\u9700\u8981\u5728\u81ea\u5df1\u7684Repository\u63a5\u53e3\u4e2d\uff0c\u901a\u8fc7\u81ea\u5b9a\u4e49\u65b9\u6cd5\u6765\u5b9e\u73b0\u5404\u79cd\u81ea\u5b9a\u4e49\u67e5\u8be2\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u7b80\u5355\u81ea\u5b9a\u4e49\u67e5\u8be2<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>  \/* \n     1. \u901a\u8fc7Query\u6ce8\u89e3\u5b9a\u4e49\u5177\u4f53\u7684\u67e5\u8be2\u5b57\u7b26\u4e32(\u4e5f\u53ef\u4ee5\u66ff\u6362\u4e3a\u5176\u4ed6\u67e5\u8be2)\n     2. \u5b57\u7b26\u4e32\u4e2d\u7684?0\u662f\u56fa\u5b9a\u683c\u5f0f\uff0c\u8868\u793a\u7b2c0\u4e2a\u53c2\u6570\u7684\u5360\u4f4d\u7b26\uff0c\u5728\u5b9e\u9645\u67e5\u8be2\u65f6\u4f1a\u88ab\u65b9\u6cd5\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570\u503ctitle\u7684\u503c\u66ff\u6362,\u5982\u679c\u6709\u591a\u4e2a\u53c2\u6570\uff0c\u4f9d\u6b21\u7c7b\u63a8\u5373\u53ef\n     3. List&lt;ServeProviderInfo&gt;\u4e3a\u67e5\u8be2\u51fa\u7684\u591a\u5929\u6587\u6863\u5c01\u88c5\u5f97\u5230\u7684\u5bf9\u8c61\n    *\/\n    @Query(\n                \"{ \" +\n                        \"\\\"match\\\": {\\n\" +\n                    \"      \\\"city\\\": \\\"?0\\\"\\n\" +\n                            \"}\" +\n                        \"}\"\n    )\n    List&lt;ServeProviderInfo&gt; matchSearch(String city);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u7684@Query\u6ce8\u89e3\u4e2d\uff0c\u53ea\u9700\u8981\u5305\u542b\u6211\u4eec\u67e5\u8be2\u811a\u672c\u4e2d&#8221;query&#8221;{} \u91cc\u9762\u7684\u5185\u5bb9\u5373\u53ef\uff0c\u6bd4\u5982\u4e0a\u9762\u7684@Query\u6ce8\u89e3\u6240\u8868\u793a\u7684\u67e5\u8be2\u7b49\u4ef7\u4e8e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET serve_provider_info\/_search\n{\n  \"query\": {\n    \"match\": {\n      \"city\": \"\u6b66\u6c49\"\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\t@Autowired\n    ServeProviderInfoRepository providerRepository;\n\n\t@Test\n    public void testMatchSearch() {\n        \/\/ \u5728\u8c03\u7528\u7684\u65f6\u5019\u4f20\u9012\u67e5\u8be2\u7684\u53c2\u6570\u503c\n        List&lt;ServeProviderInfo&gt; list = providerRepository.matchSearch(\"\u6b66\u6c49\");\n        System.out.println(list);\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5206\u9875\u81ea\u5b9a\u67e5\u8be2<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u4eec\u8fd8\u53ef\u4ee5\u7ed3\u5408\u5229\u7528@Query\u6ce8\u89e3\u7ed3\u5408\u5206\u9875\u53c2\u6570\uff0c\u5b9e\u73b0\u5206\u9875\u67e5\u8be2<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/*\n          1. \u9488\u5bf9\u4e00\u4e2a\u67e5\u8be2\u7ed3\u679c\uff0c\u8fd4\u56de\u5bf9\u5e94\u7684\u4e00\u9875\u6570\u636e\n          2. Pageable\u53c2\u6570\u662f\u5f53\u60f3\u8981\u83b7\u53d6\u5206\u9875\u6570\u636e\u7684\u65f6\u5019\uff0c\u5fc5\u987b\u643a\u5e26\u7684\u53c2\u6570\uff0c\u8868\u793a\u5206\u9875\u4fe1\u606f\n             \u6bd4\u5982\uff0c\u67e5\u8be2\u7b2c\u591a\u5c11\u9875\u6570\u636e\uff0c\u6bcf\u9875\u591a\u5c11\u6761\u6570\u636e\u7b49\uff0c\u8be5\u53c2\u6570\u4e0d\u4f1a\u7528\u6765\u66ff\u6362\u6211\u4eec\u7684@Query\u5b57\u7b26\u4e32\u4e2d\u7684\u53c2\u6570\n          3. \u8fd4\u56de\u7684\u7ed3\u679c\u662f\u4e00\u4e2a\u5305\u542b\u4e00\u9875\u6587\u6863\u6570\u636e\u7684Page\u5bf9\u8c61\n     *\/\n    @Query(\n            \" {\" +\n                    \"   \\\"match\\\": {\\n\" +\n                    \"      \\\"city\\\": \\\"?0\\\"\\n\" +\n                    \"    }\" +\n                    \"}\"\n    )\n    Page&lt;ServeProviderInfo&gt; testSearchPage(String city, Pageable pageable);<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/\/ \u6ce8\u5165repository\u5bf9\u8c61\n\t@Autowired\n    ServeProviderInfoRepository providerRepository;\n   \/*\n          \u6d4b\u8bd5\u5206\u9875\u67e5\u8be2\n     *\/\n    @Test\n    public void testSearchPage() {\n        \/\/ \u521b\u5efa\u8868\u793a\u5206\u9875\u4fe1\u606f\u7684Pageable\u5bf9\u8c61\n        \/\/ \u8868\u793a\u67e5\u8be2\u7b2c\u51e0\u9875\u6570\u636e\uff0c\u8fd9\u91cc\u4e00\u5b9a\u8981\u6ce8\u610f\uff0c\u9875\u6570\u662f\u4ece0\u5f00\u59cb\u7b97\u7684\n        int page = 0;\n        \/\/ \u6bcf\u9875\u5047\u8bbe10\u4e2a\u6587\u6863\n        int pageCount = 10;\n  \n        \/\/ \u8c03\u7528Sort\u65b9\u6cd5\u5f97\u5230Sort\u5bf9\u8c61\uff0c\u4e00\u4e2aSort\u5bf9\u8c61\u8868\u793a\n         Sort sort = Sort.by(Sort.Direction.ASC, \"acceptNum\");\n        \/\/ PageRequest \u662f Pageable\u63a5\u53e3\u5b50\u7c7b\u5bf9\u8c61\n         PageRequest pageInfo = PageRequest.of(page, pageCount,sort);\n\n        \/\/ \u8fd9\u91cc\u7684Page\u5bf9\u8c61\u53ef\u4ee5\u88ab\u770b\u505a\u662fList\n        Page&lt;ServeProviderInfo&gt; pageResult = serveProviderInfoRepository.testSearchPage(\"\u6b66\u6c49\", pageInfo);\n\n        \/\/ \u904d\u5386\u96c6\u5408\uff0c\u4ece\u6bcf\u4e2aSearchHit\u5bf9\u8c61\u4e2d\u53d6\u51fa\u6587\u6863\u5bf9\u8c61,\n        \/\/ \u5982\u679c\u9700\u8981\u8fd4\u56de\u53ef\u4ee5\u5728\u904d\u5386\u7684\u65f6\u5019\u5c06\u5176\uff0c\u653e\u5165\u4e00\u4e2aList\u4e2d\u8fd4\u56de\n        pageResult.forEach( providerInfo -&gt; {\n            \/\/ \u8bbf\u95ee\u67e5\u8be2\u5230\u7684\u4e00\u6761\u6587\u6863\n\n            \/\/ ...\n        });\n\n        \/\/ \u83b7\u53d6\u6ee1\u8db3\u6761\u4ef6\u7684\u603b\u7684\u6587\u6863\u6570\u91cf\n        long totalElements = pageResult.getTotalElements();\n\n    }<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u662f\uff0c\u5982\u679c\u6211\u60f3\u8981\u5b8c\u6210\u6309\u7167\u8ddd\u79bb\u67d0\u4e2a\u4e2d\u5fc3\u70b9\u7684\u4f4d\u7f6e\u5bf9\u6587\u6863\u8fdb\u884c\u6392\u5e8f\u5462\uff1f\u6b64\u65f6Repository\u63a5\u53e3\u5c31\u4e0d\u591f\u7528\u4e86\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">ElasticsearchOperations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u6240\u4ee5\uff0cRepository\u53ea\u9002\u7528\u4e8e\u6bd4\u8f83\u7b80\u5355\u7684\u573a\u666f\uff0c\u5982\u679c\u9762\u5bf9\u6bd4\u8f83\u590d\u6742\u7684\u573a\u666f\u6211\u4eec\u5c31\u5fc5\u987b\u4f7f\u7528ElasticsearchOperations\u5bf9\u8c61\u4e86\u3002\u5b8c\u6210\u5982\u4e0b\u67e5\u8be2\u548c\u6392\u5e8f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u67e5\u8be2 1)\u5728\u6b66\u6c49\u63a5\u5355\uff0c2)\u5df2\u5b8c\u6210\u5b9e\u540d\u8ba4\u8bc1 3\uff09\u5904\u4e8e\u6b63\u5e38\u63a5\u5355\u72b6\u6001 4\uff09\u80fd\u63d0\u4f9bid\u4e3a103\u7684\u670d\u52a1 5\uff09\u670d\u52a1\u65f6\u95f4\u4e0d\u80fd\u4e3a2025111912 6\uff09\u63a5\u5355\u6570\u5c0f\u4e8e10\u5355\u7684\u5bb6\u653f\u5de5\u4f5c\u4eba\u5458<\/li>\n\n\n\n<li>\u4e14\u6839\u636e\u5176\u4e8e(30.5931,114.3054)\u8ddd\u79bb\u7684\u8fdc\u8fd1\u6392\u5e8f<\/li>\n\n\n\n<li>\u4e14\u67e5\u8be2\u7ed3\u679c\u4e2d\u53ea\u9700\u8981\u5305\u542b\uff1aid\uff0caccept_num\u5373\u53ef<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>GET serve_provider_info\/_search\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": &#91;\n        {\n          \"match\": {\n            \"city\": \"\u6b66\u6c49\"\n          }\n        },\n        {  \n          \"term\": {\n            \"serveItemIds\": {\n              \"value\": \"102\"\n            }\n          }\n        }\n      ],\n      \"must_not\": &#91;\n        {\n          \"term\": {\n            \"serveTimes\": {\n              \"value\": 2025111912\n            }\n          }\n        },\n        {\n          \"range\": {\n            \"acceptNum\": {\n              \"gte\": 10\n            }\n          }\n        }\n      ], \n      \"filter\": &#91;\n        {\n          \"term\": {\n            \"pickUp\": 1\n          }\n        },\n        {\n          \"term\": {\n            \"settingStatus\": 1\n          }\n        }\n      ]\n    }\n  },\n  \"sort\": &#91;\n    {\n      \"_geo_distance\": {\n        \"location\": \"30.5931,114.3054\",\n        \"order\": \"asc\",\n        \"unit\": \"km\",\n        \"distance_type\": \"arc\"\n      }\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code> String city = \"\u6b66\u6c49\";\n        Long serveItemId = 102L;\n        Long serveTime = 2025111912L;\n        Integer acceptNum = 10;\n        Integer pickUp = 1;\n        Integer settingStatus = 1;\n\n        \/\/ \u6784\u9020\u6574\u4e2a\u67e5\u8be2\u6761\u4ef6\n        Query query = Query.of(q -&gt; q.bool(bool -&gt; bool\n                \/\/ \u6784\u9020must\u6761\u4ef6: \u67e5\u8be2city\u662f\u5426\u662f\u6307\u5b9acity\n                .must(must -&gt; must\n                        .match(match -&gt; match\n                        .field(\"city\")\n                        .query(city)))\n                \/\/ \u6784\u9020must\u6761\u4ef6: \u67e5\u8be2\u6280\u80fd\u5217\u8868serveItemIds\u4e2d\u662f\u5426\u5305\u542b\u6307\u5b9a\u6280\u80fd\n                .must(must -&gt; must\n                        .term(term -&gt; term\n                        .field(\"serveItemIds\")\n                        .value(serveItemId)))\n                \/\/ \u6784\u9020must_not\u6761\u4ef6: \u5df2\u7ecf\u63a5\u5355\u7684\u670d\u52a1\u65f6\u95f4\u4e2d\u4e0d\u80fd\u5305\u542b\u6307\u5b9a\u7684\u670d\u52a1\u65f6\u95f4\n                .mustNot(mustNot -&gt; mustNot\n                        .term(term -&gt; term\n                        .field(\"serveTimes\")\n                        .value(serveTime)))\n                \/\/ \u6784\u9020must_not\u6761\u4ef6: \u5df2\u7ecf\u63a5\u5355\u7684\u6570\u91cf\u4e0d\u5f97\u8d85\u8fc7\u6307\u5b9a\u7684\u6570\u91cf\n                .mustNot(mustNot -&gt; mustNot\n                        .range(range -&gt; range\n                        .field(\"acceptNum\")\n                        .gte(JsonData.of(acceptNum))))\n                \/\/ \u6784\u9020filter\u6761\u4ef6: \u5df2\u5f00\u542f\u63a5\u5355\u72b6\u6001\n                .filter(filter -&gt; filter\n                        .term(term -&gt; term\n                        .field(\"pickUp\")\n                        .value(pickUp)))\n                \/\/ \u6784\u9020filter\u6761\u4ef6: \u5df2\u7ecf\u505a\u5b8c\u4e86\u5b9e\u540d\u8ba4\u8bc1\n                .filter(filter -&gt; filter\n                        .term(term -&gt; term\n                        .field(\"settingStatus\")\n                        .value(settingStatus)))));\n\n        \/\/ \u6784\u9020\u8ddd\u79bb\u6392\u5e8f\n        Sort sort = Sort.by(new GeoDistanceOrder(\"location\", new GeoPoint(30.5931, 114.3054))\n                .with(Sort.Direction.ASC)\n                .withUnit(\"km\"));\n\n        \/\/ \u6784\u9020NativeQuery\u5bf9\u8c61\u4ee3\u8868\u6574\u4e2a\u67e5\u8be2\u8bf7\u6c42\n        NativeQuery searchQuery = NativeQuery.builder()\n                \/\/ \u8bbe\u7f6e\u67e5\u8be2\n                .withQuery(query)\n                \/\/ \u8bbe\u7f6e\u6392\u5e8f\n                .withSort(sort)\n                \/\/ \u8bbe\u7f6e\u5206\u9875\n                .withPageable(PageRequest.of(0, 2))\n                \/\/ \u8fd4\u56de\u7684\u6587\u6863\u53ea\u5305\u542bid\uff0cacceptNum\u5b57\u6bb5\u503c\n                .withSourceFilter(new FetchSourceFilter(new String&#91;]{\"id\", \"acceptNum\"}, null))\n                .build();\n\n        SearchHits&lt;ServeProviderInfo&gt; searchHits =\n                \/\/ \u53d1\u8d77\u67e5\u8be2\u8bf7\u6c42\n                elasticsearchOperations.search(searchQuery, ServeProviderInfo.class);\n\n        \/\/ \u83b7\u53d6\u67e5\u8be2\u5230\u7684\u603b\u7684\u6587\u6863\u6761\u6570\n        System.out.println(searchHits.getTotalHits());\n\n        \/\/ \u904d\u5386\u67e5\u8be2\u5230\u7684\u6bcf\u6761\u6587\u6863\u6570\u636e\n        for (SearchHit&lt;ServeProviderInfo&gt; hit : searchHits.getSearchHits()) {\n            \/\/ \u8f93\u51fa\u6587\u6863\u7684\u539f\u59cb\u503c(\u5c01\u88c5\u6210\u4e86ServeProviderInfo)\n            System.out.println(hit.getContent());\n            \/\/ \u83b7\u53d6\u8ddd\u79bb\u4e2d\u5fc3\u70b9\u7684\u6392\u5e8f\u503c(\u5c31\u662f\u8ddd\u79bb\u4e2d\u5fc3\u70b9\u7684\u8ddd\u79bb)\n            Object distance = hit.getSortValues().isEmpty() ? null : hit.getSortValues().get(0);\n            System.out.println(\"distance: \" + distance);\n        }<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring Data Elasticsearch\u4e3a\u6587\u6863\u7684\u5b58\u50a8\uff0c\u67e5\u8be2\uff0c\u6392\u5e8f\u7b49\u64cd\u4f5c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u9ad8\u5ea6\u62bd\u8c61\u7684\u6a21\u677f\u3002\u4f7f\u7528 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[18,14],"class_list":["post-372","post","type-post","status-publish","format-standard","hentry","category-learn","tag-spring","tag-14"],"_links":{"self":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/372","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/comments?post=372"}],"version-history":[{"count":1,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/372\/revisions"}],"predecessor-version":[{"id":373,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/posts\/372\/revisions\/373"}],"wp:attachment":[{"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/media?parent=372"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/categories?post=372"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/larkdrop.cafe\/index.php\/wp-json\/wp\/v2\/tags?post=372"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}