123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631 |
- <?php
- namespace app\controller;
- use app\model\CdssXyDisease;
- use app\model\XyZskDisease;
- use think\facade\Log;
- use think\facade\Request;
- use think\response\Json;
- /**
- * Es学科分析
- */
- class EsDepartment extends CommonEsController
- {
- /**
- * 首页
- *
- * @param string $value
- * @param string $year
- * @param string $tag
- * @return Json
- */
- public function index():Json
- {
- $selectValue = Request::param('value') ?? '';
- $year = Request::param('year') ?? '';
- $tag = Request::param('tag') ?? 'disease';
- if( ! $selectValue || ! $year) {
- return $this->_json_error('参数请求有误!');
- }
- /**
- * 单个|多个 疾病
- */
- if('disease' === $tag) {
- if(stripos($selectValue, ',') !== false) {
- $diseaseList = explode(',' , $selectValue);
- } else {
- $diseaseList = $selectValue;
- }
- }
- /**
- * 某个科室下疾病
- */
- if('department' === $tag) {
- $diseaseList = $this->getDiseaseByDepartment($selectValue);
- }
- /**
- * es查询数据
- */
- $esData = $this->esQuery($diseaseList , $year);
- /**
- * 相关的发文总量
- */
- $total = $esData['hits']['total'];
- /**
- * 主要主题统计
- */
- $subjectTop = $esData['aggregations']['subjectTop']['buckets'][0]['doc_count'] ?? 0;;
- /**
- * 次要主题统计
- */
- $subjectSub = $esData['aggregations']['subjectSub']['buckets'][0]['doc_count'] ?? 0;
- /**
- * 被引用文章数量
- */
- $citedCnt = $esData['aggregations']['citedCnt']['doc_count'];
- /**
- * 总的被引量
- */
- $totalCitationCnt = $esData['aggregations']['citedCnt']['totalCitationCnt']['value'];
- /**
- * 最高单篇被引量
- */
- $maxCitation = $esData['aggregations']['citedCnt']['maxCitation']['value'];
- /**
- * 篇平均被引量
- */
- $citationsPerArticleAverageNumber = 0 == $citedCnt ? 0 : ceil($totalCitationCnt / $citedCnt);
- /**
- * 合作成功数
- */
- $successCopOrg = $esData['aggregations']['successCopOrg']['doc_count'];
- /**
- * 合作机构数
- */
- $corOrgCnt = $esData['aggregations']['successCopOrg']['corOrgCnt']['value'];
- /**
- * 合作学者数
- */
- $corAuthorCnt = $esData['aggregations']['successCopAuthor']['corAuthorCnt']['value'];
- /**
- * 被引用的文献总作者数量
- */
- $citedAuthorCnt = $esData['aggregations']['citedCnt']['citedAuthorCnt']['value'];
- /**
- * 总的发文作者数量
- */
- $totalAuthorCnt = $esData['aggregations']['totalAuthorCnt']['value'];
- /**
- * 作者人均发文量
- */
- $authorPerArticleNum = 0 == $totalAuthorCnt ? 0 : round($total / $totalAuthorCnt , 2);
- /**
- * 作者人均被引量
- */
- $authorPerCitation = 0 == $citedAuthorCnt ? 0 : round($citedCnt / $citedAuthorCnt , 2);
- /**
- * 被引趋势
- */
- $postTrend = $esData['aggregations']['docStat']['buckets'];
- $citedTrend = [];
- foreach ($postTrend as $key => $value) {
- $citedTrend[$key]['key'] = $value['key'];
- $citedTrend[$key]['doc_count'] = $value['citedPerYear']['value'];
- }
- $relevantScholars = $esData['aggregations']['topAuthors']['buckets'];
- $newRelevantScholars = [];
- foreach($relevantScholars as $key => $value) {
- $arr = explode('#' , $value['key']);
- $newRelevantScholars[$key]['key'] = $arr[0];
- $newRelevantScholars[$key]['org'] = $arr[1];
- $newRelevantScholars[$key]['doc_count'] = $value['doc_count'];
- //$newRelevantScholars[$key]['org'] = $this->getOrganization($value['key']);
- }
- /**
- * 数据返回
- */
- $esDepartment = [
- /**
- * 查询值
- */
- 'value' => $selectValue ,
- /**
- * 数据统计
- */
- 'count' => [
- /**
- * 学术生产力
- */
- 'academic_productivity' => [
- 'doc_num' => $total ,
- 'subject_top' => $subjectTop ,
- 'subject_sub' => $subjectSub ,
- ],
- /**
- * 学术影响力
- */
- 'academic_influence' => [
- 'cited_amount' => $totalCitationCnt , // 被引量
- 'highest_single_article_citation_amount' => 0 == $total ? 0 : $maxCitation, // 最高单篇被引量
- 'citations_per_article_Average_number' => $citationsPerArticleAverageNumber , // 篇平均被引量
- 'cited_rate' => 0 == $total ? 0 : round($citedCnt / $total , 2) , // 被引率
- ] ,
- /**
- * 合作共创力
- */
- 'cooperation_creativity' => [
- 'partner_success_num' => $successCopOrg , // 合作成功数
- 'partner_organization_num' => $corOrgCnt , // 合作成功数
- 'partner_author_num' => $corAuthorCnt , // 合作成功数
- ] ,
- /**
- * 科研学者力
- */
- 'power_scientific_research_scholar' => [
- 'publish_doc_author_num' => $citedAuthorCnt, // 发文作者数
- 'author_per_article_num' => $authorPerArticleNum , // 作者人均发文量
- 'author_per_citation' => $authorPerCitation , // 作者人均被引量
- ]
- ] ,
- /**
- * 统计图
- */
- 'detail_analyse' => [
- 'post_trend' => $postTrend , // 发文趋势
- 'cited_trend' => $citedTrend , // 被引趋势
- 'subject_infiltration' => $esData['aggregations']['topSubject']['buckets'] , // 学科渗透
- 'research_topic' => $esData['aggregations']['keywordCnt']['buckets'] , // 研究主题
- 'hot_body' => $esData['aggregations']['topOrgs']['buckets'] , // 热门机构
- 'relevant_scholars' => $newRelevantScholars , // 相关学者
- 'subject_top' => $esData['aggregations']['subjectTop']['buckets'], // 主要主题
- 'subject_sub' => $esData['aggregations']['subjectSub']['buckets'], // 次要主题
- ]
- ];
- return $this->_json_succ(
- $esDepartment
- );
- }
- /**
- * 获取学者机构
- */
- protected function getOrganization($author)
- {
- $index = $this->currentLanguage();
- $params = [
- 'index' => $index ,
- 'body' => [
- 'query' => [
- 'bool' => [
- 'filter' => [
- 'term' => [
- 'author_list.keyword' => $author
- ]
- ]
- ]
- ],
- 'size' => 30
- ]
- ];
- $client = $this->getEsClient();
- $result = $client->search($params);
- $total = $result['hits']['total'];
- $data = $result['hits']['hits'];
- $org['org'] = '';
- if(0 == $total) {
- return $org;
- }
- $source = array_column($data , '_source');
- $authorOrgList = array_column($source , 'author_org_list');
- $str = [];
- foreach($authorOrgList as $key => $value) {
- if (!is_array($value)){
- continue;
- }
- $valueCount = count($value);
- for ($i=0; $i<$valueCount; $i++) {
- $orgAuthor = $value[$i];
- if(stripos($orgAuthor , $author) !== false) {
- $str = $orgAuthor;
- }
- }
- }
- if(empty($str)) {
- return $org;
- }
- $authorOrgArr = explode('#' , $str);
- $org = $authorOrgArr[1] ?? '';
- return $org;
- }
- /**
- * 某个科室下疾病
- *
- * @param string $department
- * @return array
- */
- protected function getDiseaseByDepartment($department):array
- {
- $singleDepartmentDiseases = XyZskDisease::field('name , departmentLevel1 as department')->withSearch('departmentLevel1' ,
- [
- 'departmentLevel1' => $department
- ]
- )->select()->toArray();
- if(empty($singleDepartmentDiseases)) {
- $singleDepartmentDiseases = [];
- }
- return array_column(
- $singleDepartmentDiseases , 'name'
- );
- }
- /**
- * es-query查询
- *
- * @param string|array $diseaseList
- * @param string $year
- * @return array
- */
- protected function esQuery($diseaseList , $year):array
- {
- $yearArr = explode(',', $year);
- if(is_array($diseaseList)) {
- foreach($diseaseList as $disease) {
- $should[] = [
- 'match_phrase' => [
- 'title' => $disease
- ]
- ];
- }
- } else {
- $disease = $diseaseList;
- $should[] = [
- 'match_phrase' => [
- 'title' => $disease
- ]
- ];
- }
- $params = [
- 'index' => $this->currentLanguage(),
- 'body' => [
- 'size' => 20 ,
- 'query' => [
- 'bool' => [
- 'must' => [
- [
- 'range' => [
- 'year' => [
- 'gte' => $yearArr[0] ,
- 'lte' => $yearArr[1]
- ]
- ]
- ]
- ] ,
- 'should' => [
- $should
- ] ,
- 'minimum_should_match' => 1
- ]
- ] ,
- 'aggs' => [
- 'topSubject' => [
- 'terms' => [
- 'field' => 'subject_top_list.keyword' ,
- 'order' => [
- '_count' => 'desc'
- ] ,
- 'size' => 10
- ]
- ] ,
- 'topAuthors' => [
- 'terms' => [
- 'field' => 'author_org_list.keyword' ,
- 'order' => [
- '_count' => 'desc'
- ] ,
- 'size' => 15
- ]
- ],
- 'topOrgs' => [
- 'terms' => [
- 'field' => 'organization_parsed.keyword' ,
- 'order' => [
- '_count' => 'desc'
- ] ,
- 'size' => 15
- ]
- ],
- 'keywordCnt' => [
- 'terms' => [
- 'field' => 'keyword_list.keyword' ,
- 'order' => [
- '_count' => 'desc'
- ] ,
- 'size' => 20
- ]
- ],
- 'docStat' => [
- 'terms' => [
- 'field' => 'year' ,
- 'order' => [
- '_key' => 'asc'
- ] ,
- 'size' => 200
- ] ,
- 'aggs' => [
- 'citedPerYear' => [
- 'sum' => [
- 'field' => 'citation_relate_count'
- ]
- ]
- ]
- ],
- 'citedCnt' => [
- 'filter' => [
- 'range' => [
- 'citation_relate_count' => [
- 'gte' => 1
- ]
- ]
- ] ,
- 'aggs' => [
- 'totalCitationCnt' => [
- 'sum' => [
- 'field' => 'citation_relate_count'
- ]
- ] ,
- 'maxCitation' => [
- 'max' => [
- 'field' => 'citation_relate_count'
- ]
- ] ,
- 'citedAuthorCnt' => [
- 'cardinality' => [
- 'field' => 'author_list.keyword'
- ]
- ]
- ]
- ],
- 'successCopOrg' => [
- 'filter' => [
- 'range' => [
- 'organization_count' => [
- 'gte' => 1
- ]
- ]
- ] ,
- 'aggs' => [
- 'corOrgCnt' => [
- 'cardinality' => [
- 'field' => 'organization_parsed.keyword'
- ]
- ]
- ]
- ],
- 'successCopAuthor' => [
- 'filter' => [
- 'range' => [
- 'author_count' => [
- 'gt' => 1
- ]
- ]
- ] ,
- 'aggs' => [
- 'corAuthorCnt' => [
- 'cardinality' => [
- 'field' => 'author_list.keyword'
- ]
- ]
- ]
- ],
- 'totalAuthorCnt' => [
- 'cardinality' => [
- 'field' => 'author_list.keyword' ,
- 'precision_threshold' => 1000
- ]
- ],
- 'subjectTop' => [
- 'terms' => [
- 'field' => 'subject_top_list.keyword' ,
- 'order' => [
- '_count' => 'desc'
- ],
- 'size' => 20
- ] ,
- ],
- 'subjectSub' => [
- 'terms' => [
- 'field' => 'subject_sub_list.keyword' ,
- 'order' => [
- '_count' => 'desc'
- ],
- 'size' => 20
- ] ,
- ]
- ] ,
- 'sort' => [
- [
- 'year' => [
- 'order' => 'desc'
- ]
- ]
- ]
- ]
- ];
- $client = $this->getEsClient();
- return $client->search(
- $params
- );
- }
-
- /**
- * 搜索疾病提示(本科室下搜索)
- *
- * @param string $disease 疾病名称
- * @return Json
- */
- public function searchDisease():Json
- {
- $department = Request::param('department') ?? '';
- $disease = Request::param('disease') ?? '';
- if( ! $disease || ! $department) {
- return $this->_json_error('请求参数错误!');
- }
- $diseaseList = CdssXyDisease::field('name')->where('department_1' , $department)->where('name' , 'like' , "%$disease%")->whereOr('alias' , 'like' , "%$disease%")->select()->toArray();
- if(empty($disease)) {
- $diseaseList = [];
- }
- return $this->_json_succ(
- $diseaseList
- );
- }
- /**
- * 全部文献(相关推荐底部)
- */
- public function allDocument()
- {
- $page = Request::param('page') ?? 1;
- $limit = ($page - 1) * $this->pagesize;
- $tag = Request::param('tag') ?? '';
- $values = Request::param('values') ?? '三明';
- if( ! $values) {
- return $this->_json_error('请求参数有误!');
- }
- switch($tag) {
- /**
- * 学科渗透
- */
- case "subject_infiltration":
- $field = 'subject_top_list.keyword';
- break;
- /**
- * 研究主题
- */
- case "research_topic":
- $field = 'subject_top_list.keyword';
- break;
- /**
- * 热门机构
- */
- case "hot_body":
- $field = 'organization_parsed.keyword';
- break;
- /**
- * 相关学者
- */
- case "relevant_scholars":
- $field = 'author_list.keyword';
- break;
- default:
- $field = 'title';
- break;
- }
- $query = [];
- if(stripos($values , ',') !== false) {
- $valuesArr = explode(',' , $values);
- foreach ($valuesArr as $value) {
- if('relevant_scholars' === $tag) {
- $valuesArr = explode('-', $value);
- $value = $valuesArr[0];
- }
- $query['bool']['must'][] = [
- 'match' => [
- $field => $value
- ]
- ];
- }
- } else {
- $query['bool']['must'][] = [
- 'match' => [
- $field => $values
- ]
- ];
- }
- $params = [
- 'index' => $this->currentLanguage() ,
- 'body' => [
- 'from' => $limit,
- 'size' => $this->pagesize,
- 'query' => $query,
- 'sort' => [
- [
- 'year' => [
- 'order' => 'desc'
- ]
- ]
- ]
- ]
- ];
- $client = $this->getEsClient();
- $result = $client->search(
- $params
- );
- $total = $result['hits']['total'];
- $totalPage = ceil($total / $this->pagesize);
- $hits = $result['hits']['hits'];
- $data = array_column($hits, '_source');
- return $this->_json_succ(
- [
- 'total_page' => $totalPage ,
- 'total' => $total,
- 'list' => $data
- ]
- );
- }
- }
|