package com.literature.retrieval.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.literature.retrieval.dao.es.LiteratureRepository;
import com.literature.retrieval.dao.mysql.LiteratureMapper;
import com.literature.retrieval.dto.LiteratureDto;
import com.literature.retrieval.po.es.LiteratureEs;
import com.literature.retrieval.po.mysql.LiteratureMysql;
import com.literature.retrieval.service.RetrievalService;
import com.literature.retrieval.vo.AdvancedQueryVo;
import org.ansj.recognition.impl.StopRecognition;
import org.ansj.splitWord.analysis.ToAnalysis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.Criteria;
import org.springframework.data.elasticsearch.core.query.CriteriaQuery;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 检索模块实现层
*
* @PACKAGE_NAME: com.literature.retrieval.service.impl
* @NAME: RetrievalServiceImpl
* @AUTHOR: Hansel Ma
* @DATE: 2021/10/18
* @PROJECT_NAME: literature-retrieval
*/
@Service
public class RetrievalServiceImpl implements RetrievalService {
@Autowired
private LiteratureMapper literatureMapper;
@Autowired
private ElasticsearchOperations elasticsearchOperations;
@Autowired
private LiteratureRepository literatureRepository;
@Override
public List<LiteratureMysql> advancedQueryLiteratureFromMysql(AdvancedQueryVo advancedQueryVo) {
QueryWrapper<LiteratureMysql> wrapper = new QueryWrapper<>();
/*
主题部分
*/
if (advancedQueryVo.getRetrievalWord() != null
&& !advancedQueryVo.getRetrievalWord().isEmpty()) {
handleTitle(wrapper, advancedQueryVo.getRetrievalWord(), advancedQueryVo.getRetrievalWordType());
}
/*
作者部分
*/
if (advancedQueryVo.getAuthor() != null
&& !advancedQueryVo.getAuthor().isEmpty()) {
wrapper.like("author", advancedQueryVo.getAuthor());
}
/*
单位部分
*/
if (advancedQueryVo.getOrganization() != null
&& !advancedQueryVo.getOrganization().isEmpty()) {
wrapper.like("organization", advancedQueryVo.getOrganization());
}
/*
来源部分
*/
if (advancedQueryVo.getOrigin() != null
&& !advancedQueryVo.getOrigin().isEmpty()) {
wrapper.like("origin", advancedQueryVo.getOrigin());
}
/*
发表时间部分
*/
if (advancedQueryVo.getPublicationTime() != null
&& !advancedQueryVo.getPublicationTime().isEmpty()) {
// TODO
}
/*
文献类型部分
*/
if (advancedQueryVo.getLiteratureType() != null
&& !advancedQueryVo.getLiteratureType().isEmpty()) {
wrapper.eq("literature_type", advancedQueryVo.getLiteratureType());
}
return literatureMapper.selectList(wrapper);
}
/**
* 处理检索词并添加检索条件给wrapper
*
* @param wrapper 传入的数据库wrapper
* @param retrievalWord 检索词
* @param retrievalWordType 检索方式
*/
private void handleTitle(QueryWrapper<LiteratureMysql> wrapper,
String retrievalWord,
Integer retrievalWordType) {
String[] retrievalWordList = retrievalWord.split(",");
List<String> formattedRetrievalWordList;
if (retrievalWordType == null) {
retrievalWordType = 0;
}
switch (retrievalWordType) {
case 0:
// 包含全部检索词
formattedRetrievalWordList = processRetrievalWord(retrievalWordList);
formattedRetrievalWordList.forEach(formattedRetrievalWord -> {
wrapper.like("title", formattedRetrievalWord);
});
break;
case 1:
// 包含全部精确检索词,即不会进行分词处理
formattedRetrievalWordList = Arrays.asList(retrievalWordList);
formattedRetrievalWordList.forEach(formattedRetrievalWord -> {
wrapper.like("title", formattedRetrievalWord);
});
break;
case 2:
// 包含至少一个检索词
formattedRetrievalWordList = processRetrievalWord(retrievalWordList);
for (int i = 0; i < formattedRetrievalWordList.size(); i++) {
wrapper.like("title", formattedRetrievalWordList.get(i));
if (i != formattedRetrievalWordList.size() - 1) {
wrapper.or();
}
}
break;
case 3:
// 不包含检索词
formattedRetrievalWordList = processRetrievalWord(retrievalWordList);
formattedRetrievalWordList.forEach(formattedRetrievalWord -> {
wrapper.notLike("title", formattedRetrievalWord);
});
break;
default:
}
}
/**
* 对中文短语进行分词处理,并去除停用词
*
* @param retrievalWordList 中文短语列表
* @return 分词且去除停用词后的词语列表
*/
private List<String> processRetrievalWord(String[] retrievalWordList) {
List<String> formattedRetrievalWordList = new ArrayList<>();
StopRecognition filter = new StopRecognition();
filter.insertStopNatures("c");
filter.insertStopNatures("p");
for (String retrievalWord : retrievalWordList) {
String formattedRetrievalWord = ToAnalysis
.parse(retrievalWord)
.recognition(filter)
.toStringWithOutNature();
formattedRetrievalWordList.addAll(Arrays.asList(formattedRetrievalWord.split(",")));
}
return formattedRetrievalWordList;
}
@Override
public List<LiteratureEs> advancedQueryLiteratureFromEs(AdvancedQueryVo advancedQueryVo) {
Criteria baseCriteria = null;
/*
主题部分
*/
if (advancedQueryVo.getRetrievalWord() != null
&& !advancedQueryVo.getRetrievalWord().isEmpty()) {
baseCriteria = new Criteria("title");
handleEsTitle(baseCriteria, advancedQueryVo.getRetrievalWord(), advancedQueryVo.getRetrievalWordType());
}
/*
作者部分
*/
if (advancedQueryVo.getAuthor() != null
&& !advancedQueryVo.getAuthor().isEmpty()) {
if (baseCriteria == null) {
baseCriteria = new Criteria("author");
baseCriteria.matchesAll(advancedQueryVo.getAuthor());
} else {
Criteria thisCriteria = new Criteria("author");
thisCriteria.matchesAll(advancedQueryVo.getAuthor());
baseCriteria.and(thisCriteria);
}
}
/*
单位部分
*/
if (advancedQueryVo.getOrganization() != null
&& !advancedQueryVo.getOrganization().isEmpty()) {
if (baseCriteria == null) {
baseCriteria = new Criteria("organization");
baseCriteria.matchesAll(advancedQueryVo.getOrganization());
} else {
Criteria thisCriteria = new Criteria("organization");
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
literature-retrieval-main.zip (47个子文件)
literature-retrieval-main
mvnw.cmd 6KB
literature_retrieval.sql 1.1MB
pom.xml 3KB
library
cs.dic 13B
ambiguity.dic 0B
src
test
java
com
literature
retrieval
AnsjTest.java 417B
LiteratureMysqlEsRetrievalApplicationTests.java 245B
controller
RetrievalControllerTest.java 2KB
LiteratureControllerTest.java 1KB
UserControllerTest.java 348B
main
resources
library.properties 18B
application.yml 344B
java
com
literature
retrieval
controller
LiteratureController.java 2KB
RetrievalController.java 3KB
UserController.java 2KB
dao
mysql
UserMapper.java 468B
LiteratureMapper.java 509B
UserLiteratureCollectionMapper.java 539B
es
LiteratureRepository.java 610B
service
UserService.java 1KB
LiteratureService.java 791B
RetrievalService.java 1KB
impl
RetrievalServiceImpl.java 13KB
UserServiceImpl.java 3KB
LiteratureServiceImpl.java 2KB
dto
LiteratureDto.java 453B
po
mysql
UserLiteratureCollection.java 796B
LiteratureMysql.java 1KB
User.java 548B
es
LiteratureEs.java 1KB
LiteratureRetrievalApplication.java 454B
util
PasswordEncoder.java 798B
vo
AdvancedQueryVo.java 917B
config
CorsConfig.java 958B
.mvn
wrapper
maven-wrapper.properties 218B
maven-wrapper.jar 50KB
MavenWrapperDownloader.java 5KB
mvnw 10KB
document
架构图.png 88KB
分词器.png 89KB
LOGO.jpg 55KB
用例图.png 69KB
ES检索结果.png 144KB
添加文献.png 46KB
MySQL检索结果.png 150KB
Reference_detail.xls 156KB
首页检索.png 111KB
共 47 条
- 1
资源评论
博士僧小星
- 粉丝: 1922
- 资源: 5884
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功