Elasticsearch实现搜附近功能

本文介绍如何使用Elasticsearch实现“搜附近”的功能。通过搭建集群、设置配置文件、编写Spring Boot应用来完成地理定位数据的存储及查询。特别展示了如何通过Geo Distance查询条件来搜索指定范围内的用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch实现搜附近功能

1、搭建一个es集群,步骤如下

# 基于docker搭建
docker pull elasticsearch:6.5.4

# 单个进程中的最大线程数
vim /etc/sysctl.conf

# 在配置文件sysctl.conf加上下面的内容,wq保存
vm.max_map_count=262144

# 在虚拟机中输入如下指令,使其配置生效
/sbin/sysctl -p

# 创建文件夹
mkdir /root/es-cluster/node01 -p
mkdir /root/es-cluster/node02 -p
mkdir /root/es-cluster/node03 -p

# 分别在文件夹node01,node02,node03下面创建jvm.options
-Xms128m
-Xmx128m
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+AlwaysPreTouch
-Xss1m
-Djava.awt.headless=true
-Dfile.encoding=UTF-8
-Djna.nosys=true
-XX:-OmitStackTraceInFastThrow
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Djava.io.tmpdir=${ES_TMPDIR}
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=data
-XX:ErrorFile=logs/hs_err_pid%p.log
8:-XX:+PrintGCDetails
8:-XX:+PrintGCDateStamps
8:-XX:+PrintTenuringDistribution
8:-XX:+PrintGCApplicationStoppedTime
8:-Xloggc:logs/gc.log
8:-XX:+UseGCLogFileRotation
8:-XX:NumberOfGCLogFiles=32
8:-XX:GCLogFileSize=64m
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
9-:-Djava.locale.providers=COMPAT

# 分别在node01,node02,node03目录下,创建elasticsearch.yml文件,并输入如下内容(其他目录只需要改一下端口号和节点名称即可):
cluster.name: es-tanhua-cluster
node.name: node01
node.master: true 
node.data: true
network.host: 192.168.241.100
http.port: 9200
discovery.zen.ping.unicast.hosts: ["192.168.241.100"]
discovery.zen.minimum_master_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"

# node.master: true 具有被选举成master的权利
# discovery.zen.minimum_master_nodes: 2 最先获得两票的就是master
# node.data: true 用来存储数据

# 分别创建3个容器(其余的两个只需要更改名称和挂载目录名称即可)
docker create --restart=always --name es-node01 --net host -v /root/es-cluster/node01/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /root/es-cluster/node01/jvm.options:/usr/share/elasticsearch/config/jvm.options -v es-cluster-node01-data:/usr/share/elasticsearch/data elasticsearch:6.5.4

# 启动容器
docker start es-node01 es-node02 es-node03

# 查看日志
docker logs -f es-node01

# 单个启动并查看日志
docker start es-node01 && docker logs -f es-node01

2、搭建工程

导入依赖

 <dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
</dependency>

编写application.properties

spring.application.name = tanhua-es
server.port = 18086

spring.data.elasticsearch.cluster-name=es-tanhua-cluster
spring.data.elasticsearch.cluster-nodes=192.168.241.100:9300,192.168.241.100:9301,192.168.241.100:9302

编写用户位置实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(indexName = "tanhua", type = "user_location", shards = 6, replicas = 2)
public class UserLocationEs{
   

    @Id
    private Long userId;
    
     /**
     * x:经度 y:纬度
     */
    @GeoPointField
    private GeoPoint location;

    @Field(type = FieldType.Keyword)
    private String address;

    @Field(type = FieldType.Long)
    private Long created;

    @Field(type = FieldType.Long)
    private Long updated;

    @Field(type = FieldType.Long)
    private Long lastUpdated;
}

// @Document(indexName = "tanhua", type = "user_location", shards = 6, replicas = 2)
// 索引的名字是tanhua(库) ;类型是user_location(表); shards = 6 分成六片 ; replicas = 2 副本为两个

控制层 UserLocationController

@RestController
@RequestMapping("es/user/location")
public class UserLocationController {
   

    @Autowired
    private UserLocationService userLocationService;

    /**
     * 查询用户的地理位置
     */
    @GetMapping("{userId}")
    public ResponseEntity<UserLocationEs> queryUserLocation(@PathVariable("userId") Long userId) {
   
        try {
   
            UserLocationEs userLocationEs = this.userLocationService.queryByUserId(userId);
            if (null == userLocationEs) {
   
                return Resp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值