信息存入es
/**
* 把首次挂号就诊信息缓存到es
*
* @param encounterSyncIndexEsdoc 就诊信息ES文档
*/
public void putEncInfoToEs(EncounterSyncIndexEsdoc encounterSyncIndexEsdoc) {
IndexQuery indexQuery = new IndexQueryBuilder().withId(encounterSyncIndexEsdoc.getEncounterId() + "")
.withObject(encounterSyncIndexEsdoc).build();
elasticsearchTemplate.index(indexQuery);
this.elasticsearchTemplate.refresh(EncounterSyncIndexEsdoc.class);
}
批量信息写入es
/**
* 批量同步就诊信息到ES
*
* @param indexEsdocs 就诊信息文档
*/
public void batchSyncEncouterInfoToEs(List<EncounterSyncIndexEsdoc> indexEsdocs) {
if (ListUtil.isEmpty(indexEsdocs)) {
return;
}
List<IndexQuery> queries = indexEsdocs.stream().map(encounter -> new IndexQueryBuilder()
.withId(encounter.getEncounterId() + "")
.withObject(encounter).build()
).collect(toList());
if (ListUtil.isNotEmpty(queries)) {
this.elasticsearchTemplate.bulkIndex(queries);
this.elasticsearchTemplate.refresh(EncounterSyncIndexEsdoc.class);
}
}
查询
/**
* 查询上次接诊信息
*
* @param encounterIds 就诊id集合
* @return
*/
public Map<Long, List<EncounterSyncIndexEsdoc>> searchEsByEncounterIds(List<String> encounterIds) {
Map<Long, List<EncounterSyncIndexEsdoc>> mapEs = new HashMap<>(16);
if (ListUtil.isEmpty(encounterIds)) {
return mapEs;
}
SearchQuery searchQuery = new NativeSearchQueryBuilder().withIds(encounterIds).build();
List<EncounterSyncIndexEsdoc> encounterSyncIndexEsdocs = elasticsearchTemplate.multiGet(searchQuery, EncounterSyncIndexEsdoc.class);
if (ListUtil.isEmpty(encounterSyncIndexEsdocs)) {
return mapEs;
}
mapEs = encounterSyncIndexEsdocs.stream().collect(Collectors.groupingBy(EncounterSyncIndexEsdoc::getEncounterId));
return mapEs;
}
public <K> K batchPutObjectES(Map<Long, T> obj, Class<K> clazz) {
if (Objects.isNull(obj)) {
return null;
}
try {
List<IndexQuery> queries = new ArrayList<>();
for (Long key : obj.keySet()) {
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(key + "")
.withObject(obj.get(key)).build();
queries.add(indexQuery);
}
if (ListUtil.isNotEmpty(queries)) {
elasticsearchTemplate.bulkIndex(queries);
elasticsearchTemplate.refresh(clazz);
}
} catch (Exception e) {
throw new WinningRuntimeException("批量存入ES异常", e);
}
return null;
}
public <R> Page<R> findByExampleForPage(SearchQuery searchQuery, Class<R> clazz, int pageNo, int pageSize) {
Pageable pageable = PageRequest.of(pageNo, pageSize);
searchQuery.setPageable(pageable);
Page<R> page = elasticsearchTemplate.queryForPage(searchQuery, clazz);
return page;
}
public <R> List<R> findByExampleForScroll(SearchQuery searchQuery, Class<R> clazz) {
List<R> rs = new ArrayList<>();
//因为查询所有满足条件的数据 ,所以避免深度查询 使用游标查询
/**
* scroll游标快照超时时间,单位ms
*/
long SCROLL_TIMEOUT = 30000;
Pageable pageable = PageRequest.of(0, 100);
searchQuery.setPageable(pageable);
ScrolledPage<R> scroll = (ScrolledPage<R>) this.elasticsearchTemplate.startScroll(SCROLL_TIMEOUT, searchQuery, clazz);
try {
while (scroll.hasContent()) {
rs.addAll(scroll.getContent());
//取下一页,scrollId在es服务器上可能会发生变化,需要用最新的。发起continueScroll请求会重新刷新快照保留时间
scroll = (ScrolledPage<R>) elasticsearchTemplate.continueScroll(scroll.getScrollId(), SCROLL_TIMEOUT, clazz);
}
} finally {
//及时释放es服务器资源
elasticsearchTemplate.clearScroll(scroll.getScrollId());
}
return rs;
}
public void updateByIds(List<String> esIds, Class clazz, Map<String, Object> map) {
if (ListUtil.isEmpty(esIds)) {
throw new WinningRuntimeException("", "就诊id集合为空");
}
IndexRequest indexRequest = new IndexRequest();
indexRequest.source(map);
List<UpdateQuery> updateQueries = new ArrayList<>();
for (String id : esIds) {
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(id)
.withClass(clazz).withIndexRequest(indexRequest).build();
updateQueries.add(updateQuery);
}
if (ListUtil.isNotEmpty(updateQueries)) {
elasticsearchTemplate.bulkUpdate(updateQueries);
elasticsearchTemplate.refresh(clazz);
}
}
public void batchUpdate(Map<String, Map<String, Object>> map, Class clazz) {
if (MapUtil.isEmpty(map)) {
throw new WinningRuntimeException("412", "集合为空");
}
List<UpdateQuery> updateQueries = new ArrayList<>();
for (Map.Entry item : map.entrySet()) {
if (!(item.getValue() instanceof Map)) {
continue;
}
Map<String, Object> temp = (Map<String, Object>) item.getValue();
for (Map.Entry<String, Object> t : temp.entrySet()) {
//时间字段转为Long型
if (t.getValue() instanceof Date) {
t.setValue(((Date) t.getValue()).getTime());
}
}
IndexRequest indexRequest = new IndexRequest();
indexRequest.source(temp);
UpdateQuery updateQuery = new UpdateQueryBuilder().withId(String.valueOf(item.getKey()))
.withClass(clazz).withIndexRequest(indexRequest).build();
updateQueries.add(updateQuery);
}
if (ListUtil.isNotEmpty(updateQueries)) {
elasticsearchTemplate.bulkUpdate(updateQueries);
elasticsearchTemplate.refresh(clazz);
}
}
public Long searchPatientForCountNew(SearchQuery buildSearchQuery) {
return elasticsearchTemplate.count(buildSearchQuery,EncounterSyncIndexEsdoc.class);
}