接触到众多的数据库中,关系型数据库、非关系型数据库
- 关系型数据库:Mysql、Sql Server、Oracle
- 非关系型数据库:Redis、Mongodb、ElasticSearch
在这些数据库中,个人认为最难的就属ElasticSearch了
在ElasticSearch中如何批量添加数据呢?
在ElasticSearch中通过ElasticsearchRestTemplate下的bulkIndex对象进行批量添加
源码如下:
也可以看到该方法的第一个参数为IndexQuery类型的集合,第二个参数是要新增的类
我们要想实现批量新增需要先将要新增的实体类以及对应的属性全部转换为IndexQuery
代码如下:
一般只同步数据库中的数据一次即可,之后在新增修改或者删除数据的时候同步到ES即可
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Value("${livegoods.search.init.enabled}")
private boolean initEnabled = false;
@Override
public void batchIndex(List<Item4ES> items) {
if(initEnabled){
createIndex();
}
ArrayList<IndexQuery> arrayList = new ArrayList();
for (Item4ES item : items) {
arrayList.add(new IndexQueryBuilder().withObject(item).build());
}
// 批量添加数据
elasticsearchRestTemplate.bulkIndex(arrayList,Item4ES.class);
}
private void createIndex(){
IndexOperations indexOperations = elasticsearchRestTemplate.indexOps(Item4ES.class);
if(indexOperations.exists()){
indexOperations.delete();
}else{
indexOperations.create();
indexOperations.refresh();
}
}
根据关键词搜索:
在创建实体类时会把需要的字段选择分词器进行分词并插入倒排索引中
代码如下:
@Override
public List<Item4ES> queryForPage(String city, String content, int page, int rows) {
BoolQueryBuilder should = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("title", content))
.should(QueryBuilders.matchQuery("houseType", content))
.should(QueryBuilders.matchQuery("rentType", content));
BoolQueryBuilder must = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("city", city)).must(should);
NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(must)
.withPageable(PageRequest.of(page, rows)).build();
SearchHits<Item4ES> search = elasticsearchRestTemplate.search(query, Item4ES.class);
List<SearchHit<Item4ES>> searchHits = search.getSearchHits();
List<Item4ES> arrayList = new ArrayList();
for (SearchHit<Item4ES> searchHit : searchHits) {
Item4ES hitContent = searchHit.getContent();
Item4ES item4ES = new Item4ES();
item4ES.setId(hitContent.getId());
item4ES.setTitle(hitContent.getTitle());
item4ES.setCity(hitContent.getCity());
item4ES.setPrice(hitContent.getPrice());
item4ES.setRentType(hitContent.getRentType());
item4ES.setImg(hitContent.getImg());
item4ES.setHouseType(hitContent.getHouseType());
arrayList.add(item4ES);
}
return arrayList;
}
网关配置如下:
配置路由断言动态uri以及必选参数,也可以配置从配置中心(gitee)上拉取公共配置
spring:
application:
name: livegoods-gateway
cloud:
gateway:
discovery:
locator:
enabled: false
lower-case-service-id: true
routes:
- id: banner
uri: lb://livegoods-banner
predicates:
- Path=/banner
- id: search
uri: lb://livegoods-search
predicates:
- Path=/search
- Query=city
- Query=content
- Query=page
config:
uri: http://localhost:9010
label: master
name: livegoods
profile: dev