跳转至

PubMed 数据库

对于需要从 PubMed 获取生物医学文献而非一般网络搜索的任务,请使用此技能。

使用时机

  • 检索 MEDLINE 或生命科学文献。
  • 使用 MeSH 术语、字段标签、日期或文献类型构建 PubMed 查询。
  • 检索 PMID、摘要、出版元数据或相关引用。
  • 执行需要可复现检索字符串的系统评价检索路径。
  • 从 Python、Shell 或其他 HTTP 客户端直接使用 NCBI E-utilities。

构建查询

从研究问题开始,将其拆分为概念,并使用布尔运算符组合这些概念。

concept_1 AND concept_2 AND filter
synonym_a OR synonym_b
NOT exclusion_term

有用的 PubMed 字段标签:

  • [ti]: 标题
  • [ab]: 摘要
  • [tiab]: 标题或摘要
  • [au]: 作者
  • [ta]: 期刊标题缩写
  • [mh]: MeSH 术语
  • [majr]: 主要 MeSH 主题
  • [pt]: 出版类型
  • [dp]: 出版日期
  • [la]: 语言

示例:

diabetes mellitus[mh] AND treatment[tiab] AND systematic review[pt] AND 2023:2026[dp]
(metformin[nm] OR insulin[nm]) AND diabetes mellitus, type 2[mh] AND randomized controlled trial[pt]
smith ja[au] AND cancer[tiab] AND 2026[dp] AND english[la]

MeSH 与副标题

当概念具有稳定的受控词汇术语时,优先使用 MeSH。如果主题较新或术语多样,请结合 MeSH 与标题/摘要术语。

在正确的副标题语法中,将副标题放在字段标签之前:

diabetes mellitus, type 2/drug therapy[mh]
cardiovascular diseases/prevention & control[mh]

[majr] 仅应在该主题必须是论文中心主题时使用。它可以提高精确度,但可能会遗漏相关研究。

过滤器

出版类型:

  • clinical trial[pt]
  • meta-analysis[pt]
  • randomized controlled trial[pt]
  • review[pt]
  • systematic review[pt]
  • guideline[pt]

日期过滤器:

2026[dp]
2020:2026[dp]
2026/03/15[dp]

可用性过滤器:

free full text[sb]
hasabstract[text]

E-utilities 工作流

NCBI E-utilities 支持可复现的 API 工作流:

  1. esearch.fcgi: 检索并返回 PMID。
  2. esummary.fcgi: 返回轻量级文章元数据。
  3. efetch.fcgi: 以 XML、MEDLINE 或文本格式获取摘要或完整记录。
  4. elink.fcgi: 检索相关文章和链接资源。

在生产脚本中使用电子邮件地址和 API 密钥。请将 API 密钥保存在环境变量中,切勿将其写入已提交的文件或命令历史。

import os
import time
import requests

BASE = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils"


def esearch(query: str, retmax: int = 20) -> list[str]:
    params = {
        "db": "pubmed",
        "term": query,
        "retmode": "json",
        "retmax": retmax,
        "tool": "ecc-pubmed-search",
        "email": os.environ.get("NCBI_EMAIL", ""),
    }
    api_key = os.environ.get("NCBI_API_KEY")
    if api_key:
        params["api_key"] = api_key

    response = requests.get(f"{BASE}/esearch.fcgi", params=params, timeout=30)
    response.raise_for_status()
    time.sleep(0.35)
    return response.json()["esearchresult"]["idlist"]


pmids = esearch("hypertension[mh] AND randomized controlled trial[pt] AND 2024:2026[dp]")
print(pmids)

对于批量处理,请优先使用 NCBI 历史服务器参数(usehistory=y、WebEnv、query_key),而不是在 URL 中传递非常长的 PMID 列表。

记录输出

为每个检索路径记录以下内容:

  • 精确的检索字符串
  • 检索的数据库
  • 检索日期
  • 使用的过滤器
  • 结果数量
  • 导出格式
  • 手动排除

示例:

| データベース | 検索日 | クエリ | フィルター | 結果 |
| --- | --- | --- | --- | ---: |
| PubMed | 2026-05-11 | `sickle cell disease[mh] AND CRISPR[tiab]` | 2020:2026[dp], English | 42 |

审查检查清单

  • 字段标签是否为有效的 PubMed 标签?
  • 对于新主题,MeSH 术语是否与自由文本同义词配对?
  • 日期范围是否明确且适当?
  • 检索日志是否包含足以复现查询的详细信息?
  • API 密钥是否从环境中读取?
  • 是否在解析前调用 raise_for_status() 检查 HTTP 状态码,或处理非 200 响应?
  • 是否遵守速率限制?

参考文献

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC