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