|
|
|
|
@ -0,0 +1,630 @@
|
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
# @Time : 2023/2/9 14:24
|
|
|
|
|
# @Author : zhaoxiangpeng
|
|
|
|
|
# @File : model.py
|
|
|
|
|
import re
|
|
|
|
|
import json
|
|
|
|
|
from typing import Union, List, Dict
|
|
|
|
|
|
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
from science_article_cnki.models.enum_cls import ResourceType, SearchTypeId, SearchFieldEnum, OperatorEnum, LogicEnum, SearchFromId
|
|
|
|
|
|
|
|
|
|
DB_CODE = {
|
|
|
|
|
'CFLS': '总库',
|
|
|
|
|
'CFLQ': '期刊',
|
|
|
|
|
'CDMD': '学位论文',
|
|
|
|
|
'CFLP': '会议',
|
|
|
|
|
'CCND': '报纸'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def export2adv(query):
|
|
|
|
|
"""
|
|
|
|
|
检索式的专业检索转高级检索
|
|
|
|
|
:param query:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if query.find('%=') != -1:
|
|
|
|
|
query = '(作者单位:%(name)s(模糊))' % {"name": query.split('%=')[-1]}
|
|
|
|
|
return query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def navigator_body(query: str = None, db_code: str = 'CFLS', **kwargs):
|
|
|
|
|
if query is None:
|
|
|
|
|
raise ValueError("query 不能为空,应为检索式,如:AF=上海交通大学,具体检索式见 "
|
|
|
|
|
"https://piccache.cnki.net/2022/kdn/index/helper/manual.html#frame2-1-5")
|
|
|
|
|
_param = {
|
|
|
|
|
'queryJson': json.dumps({
|
|
|
|
|
"Platform": "",
|
|
|
|
|
"DBCode": db_code,
|
|
|
|
|
"KuaKuCode": "CJFQ,CDMD,CIPD,CCND,CISD,SNAD,BDZK,CCJD,CCVD,CJFN",
|
|
|
|
|
"QNode": {
|
|
|
|
|
"QGroup": [
|
|
|
|
|
{"Key": "Subject", "Title": "", "Logic": 4, "Items": [
|
|
|
|
|
{"Key": "Expert", "Title": "", "Logic": 0, "Name": "", "Operate": "", "Value": query,
|
|
|
|
|
"ExtendType": 12, "ExtendValue": "中英文对照", "Value2": "", "BlurType": ""}],
|
|
|
|
|
"ChildItems": []},
|
|
|
|
|
{"Key": "ControlGroup", "Title": "", "Logic": 1, "Items": [], "ChildItems": []}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"CodeLang": ""
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
return _param
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def signal_body(query: str = None, resource_type: str = 'JOURNAL', group_id: str = 'YE', **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
获取左侧导航栏单类目的聚合
|
|
|
|
|
:group_id: 主要主题1; 学科2; 发表年度3; 研究层次4; 文献类型5; 文献来源6; 作者7; 机构8; 基金9
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if query is None:
|
|
|
|
|
raise ValueError("query 不能为空,应为检索式,如:AF=上海交通大学,具体检索式见 "
|
|
|
|
|
"https://piccache.cnki.net/2022/kdn/index/helper/manual.html#frame2-1-5")
|
|
|
|
|
_param = {
|
|
|
|
|
'queryJson': json.dumps({
|
|
|
|
|
"Platform": "",
|
|
|
|
|
"Resource": ResourceType[resource_type].name,
|
|
|
|
|
"Classid": ResourceType[resource_type].value,
|
|
|
|
|
"Products": "",
|
|
|
|
|
"QNode": {
|
|
|
|
|
"QGroup": [{
|
|
|
|
|
"Key": "Subject",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [{
|
|
|
|
|
"Key": "Expert",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Field": "EXPERT",
|
|
|
|
|
"Operator": 0,
|
|
|
|
|
"Value": query,
|
|
|
|
|
"Value2": ""
|
|
|
|
|
}],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}, {
|
|
|
|
|
"Key": "ControlGroup",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}]
|
|
|
|
|
},
|
|
|
|
|
"ExScope": "1",
|
|
|
|
|
"SearchType": SearchTypeId.GROUP.value,
|
|
|
|
|
"Rlang": "CHINESE",
|
|
|
|
|
"KuaKuCode": ""
|
|
|
|
|
}, ensure_ascii=False),
|
|
|
|
|
'groupId': group_id
|
|
|
|
|
}
|
|
|
|
|
return _param
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def refine_search(query: str, resource_type: str = 'JOURNAL', year=None, subject=None, code=None, **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
使用专业检索式,检索后再次检索年份
|
|
|
|
|
"""
|
|
|
|
|
_query = {
|
|
|
|
|
"Platform": "",
|
|
|
|
|
"Resource": ResourceType[resource_type].name,
|
|
|
|
|
"Classid": ResourceType[resource_type].value,
|
|
|
|
|
"Products": "",
|
|
|
|
|
"QNode": {
|
|
|
|
|
"QGroup": [{
|
|
|
|
|
"Key": "Subject",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [{
|
|
|
|
|
"Key": "Expert",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Field": "EXPERT",
|
|
|
|
|
"Operator": 0,
|
|
|
|
|
"Value": query,
|
|
|
|
|
"Value2": ""
|
|
|
|
|
}],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}, {
|
|
|
|
|
"Key": "ControlGroup",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}]
|
|
|
|
|
},
|
|
|
|
|
"ExScope": "1",
|
|
|
|
|
"SearchType": SearchTypeId.GROUP.value,
|
|
|
|
|
"Rlang": "CHINESE",
|
|
|
|
|
"KuaKuCode": "",
|
|
|
|
|
"View": "changeDBOnlyFT"
|
|
|
|
|
}
|
|
|
|
|
_group2 = {
|
|
|
|
|
"Key": "MutiGroup",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}
|
|
|
|
|
if year:
|
|
|
|
|
year_param = {
|
|
|
|
|
"Key": "YE",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [{
|
|
|
|
|
"Key": year,
|
|
|
|
|
"Title": "%s年" % year,
|
|
|
|
|
"Logic": 1,
|
|
|
|
|
"Field": "YE",
|
|
|
|
|
"Operator": "DEFAULT",
|
|
|
|
|
"Value": year,
|
|
|
|
|
"Value2": "",
|
|
|
|
|
"Name": "YE",
|
|
|
|
|
"ExtendType": 0
|
|
|
|
|
}],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}
|
|
|
|
|
_group2['ChildItems'].append(year_param)
|
|
|
|
|
if subject:
|
|
|
|
|
subject_param = {
|
|
|
|
|
'Key': '6',
|
|
|
|
|
'Title': '',
|
|
|
|
|
'Logic': 1,
|
|
|
|
|
'Items': [{
|
|
|
|
|
'Key': code + '?',
|
|
|
|
|
'Title': subject,
|
|
|
|
|
'Logic': 2,
|
|
|
|
|
'Name': '专题子栏目代码',
|
|
|
|
|
'Operate': '',
|
|
|
|
|
'Value': code + '?',
|
|
|
|
|
'ExtendType': 14,
|
|
|
|
|
'ExtendValue': '',
|
|
|
|
|
'Value2': '',
|
|
|
|
|
'BlurType': ''
|
|
|
|
|
}],
|
|
|
|
|
'ChildItems': []
|
|
|
|
|
}
|
|
|
|
|
_group2['ChildItems'].append(subject_param)
|
|
|
|
|
_query['QNode']['QGroup'].append(_group2)
|
|
|
|
|
return _query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def query_search(query_body, page: int = 1, handler_id: str = 18, sql: str = None,
|
|
|
|
|
sort: str = 'desc', sort_field: str = 'PT', **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
搜索请求body
|
|
|
|
|
:param query_body: 用来搜索的详细query, 与左侧导航body相同
|
|
|
|
|
:param page: 请求的页码
|
|
|
|
|
:param handler_id: 可能需要携带此参数, 在源码中获取
|
|
|
|
|
:param sql: 源码中,一般不需要
|
|
|
|
|
:param sort: 排序方式, desc/asc
|
|
|
|
|
:param sort_field: 排序字段, PT(发表时间)/CF(被引)
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if page == 1:
|
|
|
|
|
base_query = query_body.get("QNode", {}).get("QGroup", [{}])[0].get("Items", [{}])[0].get("Value")
|
|
|
|
|
aside = '( %s)' % base_query if page == 1 else ''
|
|
|
|
|
_query = {
|
|
|
|
|
"boolSearch": "true",
|
|
|
|
|
"QueryJson": json.dumps(query_body, ensure_ascii=False),
|
|
|
|
|
"pageNum": "1",
|
|
|
|
|
"pageSize": "50",
|
|
|
|
|
"dstyle": "listmode",
|
|
|
|
|
"boolSortSearch": "false",
|
|
|
|
|
"aside": aside,
|
|
|
|
|
"searchFrom": "资源范围:学术期刊; 仅看有全文,中英文扩展; 时间范围:更新时间:不限; 来源类别:全部期刊;",
|
|
|
|
|
"CurPage": "1"
|
|
|
|
|
}
|
|
|
|
|
else:
|
|
|
|
|
_query = {
|
|
|
|
|
'boolSearch': "false",
|
|
|
|
|
'QueryJson': json.dumps(query_body, ensure_ascii=False),
|
|
|
|
|
'pageNum': page,
|
|
|
|
|
'pageSize': 50,
|
|
|
|
|
'sortField': sort_field,
|
|
|
|
|
'sortType': sort,
|
|
|
|
|
'dstyle': 'listmode',
|
|
|
|
|
'boolSortSearch': "false",
|
|
|
|
|
# 'sentenceSearch': "false",
|
|
|
|
|
# 'productStr': 'YSTT4HG0,LSTPFY1C,RMJLXHZ3,JQIRZIYA,JUP3MUPD,1UR4K4HZ,BPBAFJ5S,R79MZMCB,MPMFIG1A,EMRPGLPA,J708GVCE,ML4DRIDX,WQ0UVIAA,NB3BWEHK,XVLO76FD,HR1YT1Z9,BLZOG7CK,PWFIRAGL,NN3FJMUV,NLBO1Z6R,',
|
|
|
|
|
'aside': '',
|
|
|
|
|
'searchFrom': '资源范围:学术期刊; 仅看有全文,中英文扩展; 时间范围:更新时间:不限; 来源类别:全部期刊;',
|
|
|
|
|
}
|
|
|
|
|
return _query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_cnki_export_data(ids: str):
|
|
|
|
|
"""
|
|
|
|
|
表头
|
|
|
|
|
'SrcDatabase-来源库,Title-题名,Author-作者,Organ-单位,Source-文献来源,Keyword-关键词,Summary-摘要,PubTime-发表时间,FirstDuty-第一责任人,Fund-基金,Year-年,Volume-卷,Period-期,PageCount-页码,CLC-中图分类号,ISSN-国际标准刊号,URL-网址,DOI-DOI,',
|
|
|
|
|
:param ids:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
data = {
|
|
|
|
|
'FileName': ids,
|
|
|
|
|
'DisplayMode': 'selfDefine',
|
|
|
|
|
'OrderParam': 0,
|
|
|
|
|
'OrderType': 'desc',
|
|
|
|
|
'SelectField': 'DB,TI,AU,AF,LY,KY,AB,PT,FI,FU,YE,JU,QI,PM,CLC,SN,ABSTRACT,DI,',
|
|
|
|
|
'PageIndex': 1,
|
|
|
|
|
'PageSize': 20,
|
|
|
|
|
'language': 'CHS',
|
|
|
|
|
'uniplatform': 'NZKPT',
|
|
|
|
|
'Type': 'xls',
|
|
|
|
|
}
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def export_data(ids: str):
|
|
|
|
|
"""
|
|
|
|
|
https://kns.cnki.net/dm/manage/FileToText
|
|
|
|
|
:param ids:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
data = {
|
|
|
|
|
'FileName': ids,
|
|
|
|
|
'DisplayMode': 'selfDefine',
|
|
|
|
|
'OrderParam': 0,
|
|
|
|
|
'OrderType': 'desc',
|
|
|
|
|
'SelectField': 'SrcDatabase-来源库,Title-题名,Author-作者,Organ-单位,Source-文献来源,Keyword-关键词,Summary-摘要,PubTime-发表时间,FirstDuty-第一责任人,Fund-基金,Year-年,Volume-卷,Period-期,PageCount-页码,CLC-中图分类号,ISSN-国际标准刊号,URL-网址,DOI-DOI,',
|
|
|
|
|
'PageIndex': 1,
|
|
|
|
|
'PageSize': 20,
|
|
|
|
|
'language': 'CHS',
|
|
|
|
|
'uniplatform': '',
|
|
|
|
|
'Type': 'xls',
|
|
|
|
|
}
|
|
|
|
|
return data
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def journal_nav_all(page: int = 1, page_size: int = 21):
|
|
|
|
|
model = dict(
|
|
|
|
|
searchStateJson=json.dumps(
|
|
|
|
|
{"StateID": "", "Platfrom": "", "QueryTime": "", "Account": "knavi", "ClientToken": "", "Language": "",
|
|
|
|
|
"CNode": {"PCode": "OYXNO5VW", "SMode": "", "OperateT": ""},
|
|
|
|
|
"QNode": {"SelectT": "", "Select_Fields": "", "S_DBCodes": "", "QGroup": [], "OrderBy": "OTA|DESC",
|
|
|
|
|
"GroupBy": "", "Additon": ""}}, ensure_ascii=False),
|
|
|
|
|
displaymode=1,
|
|
|
|
|
pageindex=page,
|
|
|
|
|
pagecount=page_size,
|
|
|
|
|
index='JSTMWT6S',
|
|
|
|
|
searchType='刊名(曾用刊名)',
|
|
|
|
|
clickName='',
|
|
|
|
|
switchdata=''
|
|
|
|
|
)
|
|
|
|
|
return model
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def journal_article_by_year_issue(year_issue, page: int = 0, pcode: str = None):
|
|
|
|
|
"""
|
|
|
|
|
获取期刊每一期的文章
|
|
|
|
|
:param year_issue:
|
|
|
|
|
:param page:
|
|
|
|
|
:param pcode:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if pcode is None:
|
|
|
|
|
pcode = 'CJFD,CCJD'
|
|
|
|
|
model = {
|
|
|
|
|
"yearIssue": year_issue,
|
|
|
|
|
"pageIdx": page,
|
|
|
|
|
"pcode": pcode
|
|
|
|
|
}
|
|
|
|
|
return model
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def add_limit_2query_body(limit_query: Union[List[dict], dict], body_key: str, query_body: dict):
|
|
|
|
|
"""
|
|
|
|
|
把limit添加到检索的queryJson中
|
|
|
|
|
:param limit_query:
|
|
|
|
|
:param body_key:
|
|
|
|
|
:param query_body:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
# 判断组的key是否存在,不存在的话添加一个组
|
|
|
|
|
if body_key not in {g["Key"] for g in query_body["QNode"]["QGroup"]}:
|
|
|
|
|
query_body["QNode"]["QGroup"].append({
|
|
|
|
|
"Key": body_key,
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": LogicEnum.AND.value,
|
|
|
|
|
"Items": [],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
})
|
|
|
|
|
# 遍历所有的组,满足条件则把limit添加进去
|
|
|
|
|
for group in query_body["QNode"]["QGroup"]:
|
|
|
|
|
if group["Key"] == body_key:
|
|
|
|
|
if isinstance(limit_query, dict):
|
|
|
|
|
group["ChildItems"].append(limit_query)
|
|
|
|
|
elif isinstance(limit_query, list):
|
|
|
|
|
group["ChildItems"].extend(limit_query)
|
|
|
|
|
else:
|
|
|
|
|
raise ValueError("不支持的limit类型 \n%s" % limit_query)
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_retrieval(query: str):
|
|
|
|
|
"""
|
|
|
|
|
解析aside值拼接queryJson
|
|
|
|
|
:param query:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
def func(string: str):
|
|
|
|
|
stand = string[1:-1] # 去除左右的中文括号
|
|
|
|
|
title, value = stand.split(":", maxsplit=1) # 分割 "作者单位:湖南中医药大学(模糊)" -> [作者单位, 湖南中医药大学(模糊)]
|
|
|
|
|
return title, value[:-4], value[-3:-1]
|
|
|
|
|
cond_list = re.split(r'(AND|NOT|OR)', query)
|
|
|
|
|
logic = 'AND'
|
|
|
|
|
content = cond_list[0]
|
|
|
|
|
yield logic, func(content)
|
|
|
|
|
for i in range(1, len(cond_list), 2):
|
|
|
|
|
chunk = cond_list[i:i + 2] # 获取两个元素
|
|
|
|
|
logic, content = chunk
|
|
|
|
|
yield logic, func(content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def add_search_word(search_content: str, base_query: dict = None):
|
|
|
|
|
"""
|
|
|
|
|
高级检索添加检索式
|
|
|
|
|
:param search_content: 用高级检索复制下来的aside字段
|
|
|
|
|
:param base_query:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
words_query = []
|
|
|
|
|
g = parse_retrieval(search_content)
|
|
|
|
|
i = 1
|
|
|
|
|
for logic, sequence in g:
|
|
|
|
|
field_name, word, way = sequence
|
|
|
|
|
input_select = "input[data-tipid=gradetxt-%(input_no)s]" % {"input_no": i}
|
|
|
|
|
logic_operator = LogicEnum[logic].value
|
|
|
|
|
q = {
|
|
|
|
|
"Key": input_select,
|
|
|
|
|
"Title": field_name,
|
|
|
|
|
"Logic": logic_operator,
|
|
|
|
|
"Items": [{
|
|
|
|
|
"Key": input_select,
|
|
|
|
|
"Title": field_name,
|
|
|
|
|
"Logic": logic_operator,
|
|
|
|
|
"Field": SearchFieldEnum(field_name).name,
|
|
|
|
|
"Operator": OperatorEnum[way].value,
|
|
|
|
|
"Value": word,
|
|
|
|
|
"Value2": ""
|
|
|
|
|
}],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}
|
|
|
|
|
words_query.append(q)
|
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
|
|
# 如果传入了检索式,那自动添加检索词的语句
|
|
|
|
|
if base_query:
|
|
|
|
|
add_limit_2query_body(words_query, "Subject", base_query)
|
|
|
|
|
|
|
|
|
|
return words_query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def limit_year_range(year: int, base_query: dict = None):
|
|
|
|
|
"""
|
|
|
|
|
添加年份筛选
|
|
|
|
|
:param year:
|
|
|
|
|
:param base_query:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
year = str(year)
|
|
|
|
|
ye_query = {
|
|
|
|
|
"Key": "YE",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [{
|
|
|
|
|
"Key": year,
|
|
|
|
|
"Title": "%s年" % year,
|
|
|
|
|
"Logic": 1,
|
|
|
|
|
"Field": "YE",
|
|
|
|
|
"Operator": "DEFAULT",
|
|
|
|
|
"Value": year,
|
|
|
|
|
"Value2": "",
|
|
|
|
|
"Name": "YE",
|
|
|
|
|
"ExtendType": 0
|
|
|
|
|
}],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}
|
|
|
|
|
if base_query:
|
|
|
|
|
add_limit_2query_body(ye_query, "MutiGroup", base_query)
|
|
|
|
|
|
|
|
|
|
return ye_query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def parse_updatedtime_symbol(symbol: str, today: str = None) -> tuple:
|
|
|
|
|
"""
|
|
|
|
|
从字符串解析时间范围
|
|
|
|
|
:param symbol:
|
|
|
|
|
:param today:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if today and isinstance(today, str):
|
|
|
|
|
today = datetime.strptime(today, "%Y-%m-%d")
|
|
|
|
|
else:
|
|
|
|
|
today = datetime.now()
|
|
|
|
|
if symbol == "最近一周":
|
|
|
|
|
ago_day = today - timedelta(days=7)
|
|
|
|
|
elif symbol == "最近一月":
|
|
|
|
|
ago_day = today - timedelta(days=30)
|
|
|
|
|
elif symbol == "最近半年":
|
|
|
|
|
ago_day = today - timedelta(days=181)
|
|
|
|
|
elif symbol == "最近一年":
|
|
|
|
|
ago_day = today.replace(year=today.year-1)
|
|
|
|
|
elif symbol == "今年迄今":
|
|
|
|
|
ago_day = today.replace(month=1, day=1)
|
|
|
|
|
else:
|
|
|
|
|
ago_day = today
|
|
|
|
|
return ago_day.strftime("%Y-%m-%d"), today.strftime("%Y-%m-%d")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def limit_updated_time(range_str: str, toady: str = None, base_query: dict = None):
|
|
|
|
|
"""
|
|
|
|
|
更新时间的检索式
|
|
|
|
|
:param range_str:
|
|
|
|
|
:param toady:
|
|
|
|
|
:param base_query:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
start_date, end_date = parse_updatedtime_symbol(range_str, toady)
|
|
|
|
|
rt_query = {
|
|
|
|
|
"Key": ".tit-dropdown-box>.sort",
|
|
|
|
|
"Title": "",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Items": [
|
|
|
|
|
{
|
|
|
|
|
"Key": ".tit-dropdown-box>.sort",
|
|
|
|
|
"Title": "更新时间",
|
|
|
|
|
"Logic": 0,
|
|
|
|
|
"Field": "RT",
|
|
|
|
|
"Operator": 7,
|
|
|
|
|
"Value": start_date,
|
|
|
|
|
"Value2": end_date
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"ChildItems": []
|
|
|
|
|
}
|
|
|
|
|
# 当base_query参数存在时,自动添加筛选日期范围的query
|
|
|
|
|
if base_query:
|
|
|
|
|
add_limit_2query_body(rt_query, "ControlGroup", base_query)
|
|
|
|
|
|
|
|
|
|
return rt_query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def temp_refine_search(
|
|
|
|
|
query: str,
|
|
|
|
|
year: int = None,
|
|
|
|
|
updated_date: str = None,
|
|
|
|
|
resource_type: str = 'JOURNAL',
|
|
|
|
|
**kwargs
|
|
|
|
|
):
|
|
|
|
|
"""
|
|
|
|
|
构造queryJson字段的值
|
|
|
|
|
:param query: 检索式,例:(作者单位:湖南中医药大学(模糊))OR(作者单位:湖南中医学院(模糊))
|
|
|
|
|
:param updated_date: 更新时间:不限、最近一周/一月/半年/一年、今年迄今、上一年度
|
|
|
|
|
:param year: 指定筛选的年份,如果需要与updated_date参数同时使用,需要在限制更新时间后再筛选
|
|
|
|
|
:param resource_type:
|
|
|
|
|
:param kwargs:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
_query = {
|
|
|
|
|
"Platform": "",
|
|
|
|
|
"Resource": ResourceType[resource_type].name,
|
|
|
|
|
"Classid": ResourceType[resource_type].value,
|
|
|
|
|
"Products": "",
|
|
|
|
|
"QNode": {
|
|
|
|
|
"QGroup": [
|
|
|
|
|
{
|
|
|
|
|
"Key": "Subject", "Title": "", "Logic": 0, "Items": [], "ChildItems": []
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
"Key": "ControlGroup", "Title": "", "Logic": 0, "Items": [], "ChildItems": []
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
},
|
|
|
|
|
"ExScope": "1",
|
|
|
|
|
"SearchType": 1,
|
|
|
|
|
"Rlang": "CHINESE",
|
|
|
|
|
"KuaKuCode": "",
|
|
|
|
|
"Expands": {},
|
|
|
|
|
"View": "changeDBOnlyFT",
|
|
|
|
|
"SearchFrom": 1
|
|
|
|
|
}
|
|
|
|
|
add_search_word(search_content=query, base_query=_query)
|
|
|
|
|
if updated_date and updated_date != "不限":
|
|
|
|
|
limit_updated_time(updated_date, base_query=_query)
|
|
|
|
|
if year:
|
|
|
|
|
limit_year_range(year=year, base_query=_query)
|
|
|
|
|
return _query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
adv_refine_search = temp_refine_search
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def temp_query_search(query_body, query: str = None, page: int = 1, page_size: int = 50,
|
|
|
|
|
sort: str = 'desc', sort_field: str = 'PT', updated_date: str = "不限", **kwargs):
|
|
|
|
|
"""
|
|
|
|
|
搜索请求body
|
|
|
|
|
:param query_body: 用来搜索的详细query, 与左侧导航body相同
|
|
|
|
|
:param query: aside/检索式字符串
|
|
|
|
|
:param page: 请求的页码
|
|
|
|
|
:param page_size: 每页的数量
|
|
|
|
|
:param sort: 排序方式, desc/asc
|
|
|
|
|
:param sort_field: 排序字段, PT(发表时间)/CF(被引)
|
|
|
|
|
:param updated_date: 默认不限
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
page = str(page)
|
|
|
|
|
page_size = str(page_size)
|
|
|
|
|
if page == '1':
|
|
|
|
|
aside = query or ''
|
|
|
|
|
_query = {
|
|
|
|
|
"boolSearch": "true",
|
|
|
|
|
"QueryJson": json.dumps(query_body, ensure_ascii=False),
|
|
|
|
|
"pageNum": "1",
|
|
|
|
|
"pageSize": page_size,
|
|
|
|
|
'sortField': sort_field,
|
|
|
|
|
'sortType': sort,
|
|
|
|
|
"dstyle": "listmode",
|
|
|
|
|
"boolSortSearch": "false",
|
|
|
|
|
"aside": aside,
|
|
|
|
|
"searchFrom": "资源范围:学术期刊; 仅看有全文,中英文扩展; 时间范围:更新时间:%(updated_date)s; 来源类别:全部期刊; " % {"updated_date": updated_date},
|
|
|
|
|
"subject": "",
|
|
|
|
|
"language": "",
|
|
|
|
|
"uniplatform": "",
|
|
|
|
|
"CurPage": "1"
|
|
|
|
|
}
|
|
|
|
|
else:
|
|
|
|
|
_query = {
|
|
|
|
|
'boolSearch': "false",
|
|
|
|
|
'QueryJson': json.dumps(query_body, ensure_ascii=False),
|
|
|
|
|
'pageNum': page,
|
|
|
|
|
'pageSize': page_size,
|
|
|
|
|
'sortField': sort_field,
|
|
|
|
|
'sortType': sort,
|
|
|
|
|
'dstyle': 'listmode',
|
|
|
|
|
'boolSortSearch': "false",
|
|
|
|
|
'aside': '',
|
|
|
|
|
'searchFrom': '资源范围:学术期刊; 时间范围:更新时间:%(updated_date)s; 来源类别:全部期刊; ' % {"updated_date": updated_date},
|
|
|
|
|
"subject": "",
|
|
|
|
|
"language": "",
|
|
|
|
|
"uniplatform": ""
|
|
|
|
|
}
|
|
|
|
|
return _query
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
adv_query_search = temp_query_search
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SearchPaperArgModel:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class briefParam:
|
|
|
|
|
@staticmethod
|
|
|
|
|
def getDbCode():
|
|
|
|
|
return 'CFLS'
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def getPageSize(isSearch):
|
|
|
|
|
return 50
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def getCurPage():
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def getSearchPaperArgModel(isSearch, cPage):
|
|
|
|
|
argModel = {}
|
|
|
|
|
dbCode = briefParam.getDbCode()
|
|
|
|
|
pSize = briefParam.getPageSize(isSearch)
|
|
|
|
|
cPage = cPage if cPage else briefParam.getCurPage()
|
|
|
|
|
argModel = {
|
|
|
|
|
'IsSearch': isSearch,
|
|
|
|
|
'QueryJson': ''
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
print(SearchTypeId.GROUP)
|
|
|
|
|
print(add_search_word(
|
|
|
|
|
'(作者单位:湖南中医药大学(模糊))OR(作者单位:湖南中医学院(模糊))OR(篇名:基于PINK1LETM1信号通路探讨何首乌苷减轻脑缺血再灌注损伤的作用机制(精确))'))
|