1.搜索他是一个服务,它需要注册到服务中心,而且它需要依赖feign这个服务,因为最终他要把数据库的数据同步到es中,因为同步的数据的实体类到es中,那么他的格式上必然是要符合es的格式,所以可以用 @Field去设置这个字段的信息包括,如果有的字段不需要的也可以用这个注解 @Transient去隐藏他。他怎么去操作索引库
在业务层的接口写个方法去实现,然后在实现类去完成操作
1.服务注册
2.依赖feign这个服务
3.实体类的格式要转成elasticsearch所以也要依赖他的包
4.实体类要转elasticsearch格式
5.创建索引库
6.将数据库现有的数据库同步到es中
二:增量更新:前面的代码有一个问题,将数据库现有的数据同步到es中,假如刚刚同步完,他就新增一个酒店,我们是不可能在同步一次的这样性能也太差了。所以我们干脆新增一个酒店索引库就新增一个
1.创建一个类实现CommandLineRunner
2.然后在创建索引库的时候同步数据库到索引库
三:但是这样也有一个问题搜索服务监听新增酒店的时候是没有城市信息的,因为你只有酒店的对象,那为什么做增量更新的时候又有呢?因为创建索引库的时候数据库的数据同步到了索引库,数据库里面自然有城市的信息
1.监听的新增酒店的代码
2.通过酒店信息搜索对应的城市的信息
四:关键词搜索
优先级:
hotalname 酒店名字,keyword 酒店关键词,brand 品牌,district 行政区域,room. title房间标题,hotalinfo 酒店描述,addres地址
时间范围; 时间范围内有空余房间
入住时间
离店时间
价格区间控制:求平均值
最小价格
最大价格
位置:
经纬度-距离信息
可户输入关键字查询一家酒店,这个酒店某一个房形要符合在一段时间内是有空房的而且价格要符合我的条件,但是在几天的时间是不好查的,这个查询因为没有关系并不能查出上一天和下一天的房间的代码的。我们可以查询其中某一天价格的没有客房给排掉剩下的客房就是我要的客房。在查询没有空余客房时间的时候是不能够两个字段去比较的就可以用脚步去实现
#时间范围
GET /hotal_index/_search
{
“query”: {
“boosting”: {
“positive”: {
“bool”: {
“should”: [
//关键词的匹配条件,只要符合一个条件就能查出该酒店
]
//设置了must,should不匹配也可以了因此我们的设置最少匹配一个should,因为里面是匹配关键字的
, “must”: [
{
//必须要有一间客房
“nested”: {
“path”: “rooms”,
“query”: {
“bool”: {
“must”: [
{
//满足价格要求
}
], //在时间范围内有一天是没有时间的就排掉
"must_not": [
{
//客房里面必须要有一天的价格
"nested": {
"path": "prices",
"query": {
, "bool": {
"must": [
{
// 这个客房要在这个时间范围内
"range": {
"rooms.prices.date": {
"gte":${beginTime},
"lte": ${endTime}
}
},
}
}
}
]
},
"script": {
//如果有一个文档他里面预订的数量和拥有的数量相等了就说明预订房间时间,在开始时间到结束时间范围内说明了这一天被订满了这个房间查不出来,剩下查出来的房间就是我要的房间
"script": "doc.number.value==doc.hasNumber.value"
}
}
]
}
}
}
}
],
"minimum_should_match": 1
}
},
"negative": {
},
"negative_boost": 0.2
}
}
}