以下是引用 Harry 于 2009-3-2 17:16:57 发表的文字:
图书馆在编辑完一条书目进行保存之前,应该进行一下索书号查重,我尝试着配置了一下索书号查重,过程如下:
1、编辑library.xml在内增加如下内容:
<project name="索书号查重" comment="索书号查重">
<database name="中文图书" threshold="100">
<accessPoint name="索书号" weight="100" searchStyle="" />
</database>
</project>
<default origin="中文图书" project="索书号查重" />
2、为了在查询结果中显示索书号,以方便作相应的更改,将browse文件作如下更改:
<?xml version="1.0" encoding="utf-8"?>
<root>
<nstable><item prefix="marc" url="http://dp2003.com/UNIMARC" /></nstable>
<col title="题名"><xpath nstable="">//marc:record/marc:datafield[@tag='200']/marc:subfield[@code='a']</xpath></col>
<col title="责任者"><xpath nstable="">//marc:record/marc:datafield[@tag='200']/marc:subfield[@code='f']</xpath></col>
<col title="分类号"><xpath nstable="">//marc:record/marc:datafield[@tag='690']/marc:subfield[@code='a']</xpath></col>
<col title="书次号"><xpath nstable="">//marc:record/marc:datafield[@tag='905']/marc:subfield[@code='e']</xpath></col>
<col title="主题词"><xpath nstable="">//marc:record/marc:datafield[@tag='606']/marc:subfield[@code='a']</xpath></col>
<col title="关键词"><xpath nstable="">//marc:record/marc:datafield[@tag='610']/marc:subfield[@code='a']</xpath></col>
<col title="出版社"><xpath nstable="">//marc:record/marc:datafield[@tag='210']/marc:subfield[@code='c']</xpath></col>
<col title="出版时间"><xpath nstable="">//marc:record/marc:datafield[@tag='210']/marc:subfield[@code='d']</xpath></col>
</root>
如此配置完毕之后,在dp2catalog中点“重”按键即可进行查重,但是这样检索出来的结果不令人满意,因为这样进行查重是对索书号进行完全匹配检索,而用著者号或四角号做905$e的,著者号或四角号相同则在其后加上#1,#2...或-1,-2等,如果做了完全匹配检索这样的索书号就查不出来了,当前编辑的书目也就不知道该加什么号了。
可能我的配置方法不正确,求教老师,在用著者号或四角号排序的,该如何在索书号检索点只检索905$e的前四位字符,而用种次号排序的,却要进行精确检索呢。
~~~
索书号的问题比较复杂,最近我正在大幅度改造现有的索书号、种次号模块,等有了结果后,在论坛里面详细说说。
下面简单就您目前关注的层面说一下。
由于今天时间有限,我先解决第一个问题:如何检索的时候忽略索书号的第二行中的附加号部分,也就是同类书区分号(种次号或者通用汉语著者号、四角号码型著者号等)的附加号部分?
现有的检索点,我们可以利用dp2rms前端打开一个中文图书库的keys配置文件,可以发现,所谓“索书号”检索途径,是要求完全匹配的,也就是要求检索者输入索书号的第二行内要包含附加号,才能通过精确一致检索命中。
本来通过前方一致的检索,如果索书号仅有两行的话,可以凑合解决问题。例如,对于索书号“I247.5/1234-1”,可以用检索词“I247.5/1234”进行前方一致的检索,命中。
但是,如果索书号为三行,则这个方法就不灵了。而索书号为三行是常有的事情。
所以,必须另辟蹊径,创建一个新的检索途径,我们权且把它叫做“查重用索书号”。
由于这个话题可以很好展示我们的数据库内核层面的检索点配置二次开发能力,我很乐意给示范一下。
打开keys配置文件,在适当位置增加下列片断:
<key>
<xpath nstable="">/marc:record/marc:datafield[@tag='905']</xpath>
<from>newcallnumber</from>
<table ref="newcallnumber" />
</key>
<table name="newcallnumber" id="14" type="newcallnumber">
<convert>
<string style="#createPureAccessNo" />
</convert>
<convertquery>
<string style="#getPureAccessNoQueryWord" />
</convertquery>
<caption lang="zh">查重用索书号</caption>
<caption lang="en">New Call number</caption>
</table>
注意<table>元素内的id属性值可能需要灵活调整,不要和当前keys配置文件内的任何其他id值重复。
然后在<script>元素内适当位置,增加下列两个函数:
public void createPureAccessNo()
{
XmlNamespaceManager nsmgr = new XmlNamespaceManager(this.DataDom.NameTable);
nsmgr.AddNamespace("marc", "http://dp2003.com/UNIMARC");
XmlNodeList fields = this.DataDom.SelectNodes("/marc:record/marc:datafield[@tag='905']", nsmgr);
foreach(XmlNode node in fields)
{
string d = "";
string e = "";
XmlNode subfield = node.SelectSingleNode("marc:subfield[@code='d']", nsmgr);
if (subfield != null)
d = subfield.InnerText;
subfield = node.SelectSingleNode("marc:subfield[@code='e']", nsmgr);
if (subfield != null)
e = subfield.InnerText;
// 将$e内容加工为纯净的
int nRet = e.IndexOfAny(new char [] {'.','-','#'});
if (nRet != -1)
e = e.Substring(0, nRet);
this.ResultStrings.Add((d + "/" + e).ToUpper());
}
}
// 加工索书号检索词
public void getPureAccessNoQueryWord()
{
string isbn = this.InputString;
string [] parts = this.InputString.Split(new char [] {'/'});
if (parts.Length >= 2)
{
string strText = parts[1];
// 将第二行内容加工为纯净的
int nRet = strText.IndexOfAny(new char [] {'.','-','#'});
if (nRet != -1)
strText = strText.Substring(0, nRet);
parts[1] = strText;
}
this.ResultString = string.Join("/", parts);
}
保存keys配置文件。
然后点选数据库名节点,用上下文菜单的“刷新数据库定义”命令。以上操作都是说的在dp2rms前端的检索窗的资源树形控件内。修改keys配置文件后,最好在检索窗的资源树形控件内对数据库名节点执行一次“刷新”操作,以便新增加的检索途径节点能够显示出来。
如果修改了keys配置文件的书目库内已经有数据记录,则修改配置文件后需要用dp2batch的菜单“文件/重建检索点”命令来重建一下检索点。如果不这么做,可能您会发现非常奇怪的现象:对新增加的检索途径进行检索,好好的检索词不能命中。如果懒得对整个数据库进行重建检索点的操作,那么至少要对试验的一条记录,在dp2rms详细窗中,执行一次删除然后马上重新保存记录的操作,这条记录的检索点才能正常。
作如上的二次开发改造后,您可以使用“查重用索书号”来实现您原先的查重目的了。
后继的一些事情,容我这两天有时间了再发帖做深入探讨。