You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

yaz4j连接图书馆的URL参数格式及使用方法咨询

ZgateServlet 参数格式规范详解(基于 YAZ4J Z39.50 网关)

我来帮你拆解这几个Z39.50网关请求参数的格式规则,结合你提供的ZgateServlet代码,逐一说明每个参数的定义和使用规范:


1. zurl 参数格式

zurl是Z39.50服务器的连接地址,格式遵循[主机名]:[端口]/[数据库名]的结构:

  • 主机名:Z39.50服务器的域名或IP地址,比如示例中的z3950.loc.gov
  • 端口:Z39.50服务监听的端口,标准端口是210,但示例中用的是7090(国会图书馆的特定端口)
  • 数据库名:目标服务器上的具体数据库实例,比如示例中的voyager(国会图书馆的馆藏数据库)

如果服务器有默认数据库,也可以省略数据库名,直接使用[主机名]:[端口]的格式,但建议明确指定数据库名以避免歧义。

在你的Servlet代码中,Connection con = new Connection(zurl, 0)的第二个参数0是备用端口,因为zurl已经包含了端口信息,所以这里会被忽略。


2. query 参数格式(Prefix Query 语法)

你的代码中指定了Connection.QueryType.PrefixQuery,这对应YAZ的前缀查询语法,是Z39.50协议中用于属性化查询的标准格式,示例中的@attr 1=7 0253333490就是典型用法:

基础结构

@attr [属性集编号]=[属性类型] [查询值]
  • @attr:固定前缀,标记这是一个属性查询
  • 属性集编号:常用的是1(代表Bib-1属性集,图书馆界通用的元数据属性集)
  • 属性类型:对应Bib-1集中的具体字段,比如7代表ISBN(国际标准书号)
  • 查询值:要检索的具体内容,比如示例中的0253333490

常见Bib-1属性类型(部分)

  • 1=1:作者
  • 1=4:标题
  • 1=7:ISBN
  • 1=8:ISSN
  • 1=21:主题词

多条件组合查询

可以用and/or连接多个属性查询条件,比如:

@attr 1=4 "The Hobbit" and @attr 1=1 "Tolkien"

注意:如果查询值包含空格,需要用双引号包裹。


3. syntax 参数可选值

syntax用于指定返回记录的格式,YAZ4J支持的常见格式(需目标Z39.50服务器支持)包括:

  • usmarc:美国机读目录格式,示例中使用的格式,是图书馆领域广泛使用的MARC格式
  • marcxml:MARC格式的XML版本,更易于程序解析
  • dc:Dublin Core(都柏林核心元数据),通用的轻量级元数据格式
  • xml:通用XML格式(取决于服务器配置)
  • raw:原始字节格式(不推荐,除非你能处理原始MARC字节流)

如果指定的格式服务器不支持,会抛出ZoomException,建议提前确认目标服务器支持的格式列表,或优先尝试usmarc、marcxml这类通用格式。


额外说明:maxrecs 参数

虽然你没专门提问,但代码中包含了这个可选参数:

  • 作用:指定返回的最大记录数,默认值为10
  • 格式:必须是正整数,如果传入非数字值,Servlet会返回400错误

你的ZgateServlet代码(格式化后)

package web;
/*
 * Copyright (c) 1995-2010, Index Data
 * All rights reserved.
 * See the file LICENSE for details.
 */
import org.yaz4j.Connection;
import org.yaz4j.Record;
import org.yaz4j.ResultSet;
import org.yaz4j.exception.ZoomException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 *
 * @author jakub
 */
public class ZgateServlet extends HttpServlet {
 @Override
 public void init() throws ServletException {
 System.out.println("Zeta: java.library.path=" + System.getProperty("java.library.path"));
 System.out.println("Zeta: LD_LIBRARY_PATH=" + System.getenv("LD_LIBRARY_PATH"));
 }

 @Override
 /*
 * For dinosaur search use: ?zurl=z3950.loc.gov:7090/voyager&query=@attr 1=7 0253333490&syntax=usmarc
 * */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 String zurl = request.getParameter("zurl");
 if (zurl == null || zurl.isEmpty()) {
 response.sendError(400, "Missing parameter 'zurl'");
 return;
 }
 String query = request.getParameter("query");
 if (query == null || query.isEmpty()) {
 response.sendError(400, "Missing parameter 'query'");
 return;
 }
 String syntax = request.getParameter("syntax");
 if (syntax == null || syntax.isEmpty()) {
 response.sendError(400, "Missing parameter 'syntax'");
 return;
 }

 int maxrecs=10;
 if (request.getParameter("maxrecs") != null && !request.getParameter("maxrecs").isEmpty()) {
 try {
 maxrecs = Integer.parseInt(request.getParameter("maxrecs"));
 } catch (NumberFormatException nfe) {
 response.sendError(400, "Malformed parameter 'maxrecs'");
 return;
 }
 }

 response.getWriter().println("SEARCH PARAMETERS");
 response.getWriter().println("zurl: " + zurl);
 response.getWriter().println("query: " + query);
 response.getWriter().println("syntax: " + syntax);
 response.getWriter().println("maxrecs: " + maxrecs);
 response.getWriter().println();

 Connection con = new Connection(zurl, 0);
 con.setSyntax(syntax);
 try {
 con.connect();
 ResultSet set = con.search(query, Connection.QueryType.PrefixQuery);
 response.getWriter().println("Showing " + maxrecs + " of " +set.getHitCount());
 response.getWriter().println();
 for(int i=0; i<set.getHitCount() && i<maxrecs; i++) {
 Record rec = set.getRecord(i);
 if (rec == null) continue;
 response.getWriter().print(rec.render());
 }
 } catch (ZoomException ze) {
 throw new ServletException(ze);
 } finally {
 con.close();
 }
 }

 @Override
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 }

 @Override
 public String getServletInfo() {
 return "Zeta search engine servlet";
 }
}

内容的提问来源于stack exchange,提问作者user8938126

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:24:36