搜索篇-elasticesearch
大家有没做过大量数据一键搜索的需求。【涉及数据同步】
怎么把数据串联起来,然后还要实现分页, 后台要做到能建模,比如这个表的name可作为查询字段,怎么做到动态加入
关系型到非关系型的数据同步
python爬虫 入库 然后数据清洗 导入到es【es字段固定的】【排序也是用guava脚本】
搜索分固定,模糊,分词查询
EsService
TransportClient
搜index
@Document (indexname)插入的时候自动建了【索引库】
@Field注解,注入字段。写入ES?
【理解====@ApiModelProperty(“人员ID”)
@Field(type = FieldType.String)
private String personnelId;】
es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?
es 的搜索引擎严重依赖于底层的 ffilesystem cache
Elasticsearch–java操作之QueryBuilders构建搜索Query
public PageResponse<LoginLog> list(LoginLogQuery query) {
Integer current = query.getCurrent() != null ? query.getCurrent() : 1;
Integer size = query.getSize() != null ? query.getSize() : 1;
Pageable pageable = new PageRequest(current - 1, size);
//Elasticsearch--java操作之QueryBuilders构建搜索Query
BoolQueryBuilder rootQueryBuilder = boolQuery();
if(StringUtils.isNotBlank(query.getName())){
rootQueryBuilder.filter(QueryBuilders.matchQuery("name", query.getName()));
}
if(StringUtils.isNotBlank(query.getPoliceCode())){
rootQueryBuilder.filter(QueryBuilders.matchQuery("policeCode", query.getPoliceCode()));
}
if(StringUtils.isNotBlank(query.getUserName())){
rootQueryBuilder.filter(QueryBuilders.matchQuery("userName", query.getUserName()));
}
if(StringUtils.isNotBlank(query.getOrgName())){
rootQueryBuilder.filter(QueryBuilders.matchQuery("orgName", query.getOrgName()));
}
if(query.getStartTime() != null){
rootQueryBuilder.filter(QueryBuilders.rangeQuery("loginTime").gte(DateUtil.parse(query.getStartTime(), DateUtil.YYYYMMDDHHMMSS).getTime()));
}
if(query.getEndTime() != null){
rootQueryBuilder.filter(QueryBuilders.rangeQuery("loginTime").lte(DateUtil.parse(query.getEndTime(), DateUtil.YYYYMMDDHHMMSS).getTime()));
}
//排序方式==也是es库
FieldSortBuilder sortBuilder = SortBuilders.fieldSort("loginTime").order(SortOrder.DESC);
SearchQuery searchQuery =
new NativeSearchQueryBuilder().withPageable(pageable).withQuery(rootQueryBuilder).withSort(sortBuilder).withTypes(TYPE).withIndices(INDEX).build();
Page<LoginLog> record = elasticsearchTemplate.queryForPage(searchQuery, LoginLog.class);
PageResponse<LoginLog> pageResponse = new PageResponse<>();
pageResponse.setTotal(record.getTotalElements());
pageResponse.setContent(record.getContent());
return pageResponse;
}