dp2API之GetSearchResult - DigitalPlatform/dp2 GitHub Wiki
GetSearchResult() – 获得结果集内信息
LibraryServerResult GetSearchResult(
string strResultSetName,
long lStart,
long lCount,
string strBrowseInfoStyle,
string strLang,
out Record[] searchresults);
用途:获得一个结果集内的信息。
参数表:
类型 参数名 说明
string strResultSetName 结果集名
long lStart 要获取的起点位置。从0开始计数
long lCount 要获取的元素个数
string strBrowseInfoStyle 获取方式
string strLang 语言代码
out Record[] searchresults 返回的检索结果事项数组
返回值:
成员 返回值 说明
LibraryServerResult.Value
-1 出错
>=0 结果集内记录的总数(注意,并不是本批返回的记录数)
LibraryServerResult.ErrorInfo 出错信息
权限:不需要特定的权限。
使用本API前,需要用检索API创建好结果集。结果集内包含的记录数量可能很庞大,这时需要使用本API每次获取一个小范围内的元素,多次使用才能获得结果集内的全部元素。
一个结果集内有多少个元素,在负责创建结果集的检索API的返回值中可以获知。另外,任意一次本API的调用返回值也可以获知整个结果集内的元素总数。
lCount参数指定了本次操作希望获得的元素个数。可使用”-1”表示本次希望获得尽可能多的元素。
由于返回包空间的限制,一次调用后dp2Library可能会返回比lCount参数指定的数量要少的元素。一次调用具体返回了多少元素,可以通过searchresults参数所返回的数组的Length属性得到反映。
strBrowseInfoStyle参数指定了返回的信息形态。一共有三种形态:
1)既不包含”keycount”子串,也不包含”keyid”子串。表示希望获取命中记录的路径和浏览列。通常strBrowseInfoStyle的值为”id,cols”。
从返回的Record对象的Path成员中可以取得命中记录的路径,从Record对象的Cols成员中可以获得浏览列信息。
2)如果包含”keycount”子串,表示希望获取命中的检索点字符串和该检索点的命中数量两种信息。从返回的Record对象的Path成员中可以取得命中的检索点,从Record对象的Cols成员的第一个元素中可以取得该检索的命中数(数字字符串)。在这种方式下,strBrowseInfoStyle中不能包含子串id/cols,因为此时并不具备命中记录的记录路径,也无法获得命中记录的浏览信息。
3)如果包含”keyid”子串,表示希望获取命中的检索点字符串和记录路径两种信息。
在这种形态下,strBrowseInfoStyle中还应当包含id/key/cols中至少一个子串,分别表示希望获得记录路径、检索点信息、浏览列信息。
从返回的Record对象的Path成员中可以取得命中记录的路径,从Record对象的Keys成员中可以获得命中此条记录的检索点信息。Keys是类型为KeyFrom的对象数组,每个KeyFrom对象表示逻辑运算的一个具体步骤。从Record对象的Cols成员中可以获得浏览列信息。
“keycount”或”keyid”形态,要求结果集是由strOutputStyle参数值为”keycount”或”keyid”时的检索API所创建的才行。
浏览列的格式一般情况下是由命中记录所在内核数据库之下的cfgs/browse文件定义的。
strBrowseInfoStyle参数中还可以指定特定的浏览列格式。通过在其中包含形态为”format:????”这样的子串,就可以指定特定的浏览列格式。例如,”format:cfgs/browse_callnumber”,表示希望通过命中记录所在的内核数据库之下的cfgs/browse_callnumber配置文件来构造浏览列。例子中的browse_callnumber配置文件和browse配置文件采用同样的定义方法。如果strBrowseInfoStyle参数中没有包含”format:????”形态的子串,则浏览列的构造方法就是命中记录所在的内核数据库之下的cfgs/browse配置文件来决定的。
strBrowseInfoStyle参数中可以通过包含子串xml/timestamp/metadata中至少一个,来指示返回命中记录的更进一步的信息。如果本参数包含了”xml”子串,则在返回的Record对象的RecordBody成员的Xml成员中包含了记录的XML字符串;如果本参数包含了”timestamp”子串,则在返回的Record对象的RecordBody成员的Timestamp成员中包含了记录的时间戳;如果本参数包含了”metadata”子串,则在返回的Record对象的RecordBody成员的Metadata成员中包含了记录的元数据XML字符串。
searchresults参数中用到的Record结构定义如下:
[DataContract(Namespace = "http://dp2003.com/dp2kernel/")]
public class Record
{
[DataMember]
public string Path = ""; // 带库名的全路径
[DataMember]
public KeyFrom[] Keys = null; // 检索命中的key+from字符串数组
[DataMember]
public string[] Cols = null;
[DataMember]
public RecordBody RecordBody = null; // 记录体
}
Record结构中用到的KeyFrom结构定义如下:
[DataContract(Namespace = "http://dp2003.com/dp2kernel/")]
public class KeyFrom
{
[DataMember]
public string Logic = ""; // 逻辑元素符。为“AND”或“OR”
[DataMember]
public string Key = ""; // 检索点字符串
[DataMember]
public string From = ""; // 检索途径
}
Record结构中用到的RecordBody结构定义如下:
[DataContract(Namespace = "http://dp2003.com/dp2kernel/")]
public class RecordBody
{
[DataMember]
public string Xml = "";
[DataMember]
public byte[] Timestamp = null;
[DataMember]
public string Metadata = "";
[DataMember]
public Result Result = new Result(); // 操作结果
}
RecordBody结构中用到的Result结构定义如下:
[DataContract(Namespace = "http://dp2003.com/dp2kernel/")]
public class Result
{
[DataMember]
public long Value = 0; // 命中条数,>=0:正常;<0:出错
[DataMember]
public ErrorCodeValue ErrorCode = ErrorCodeValue.NoError;
[DataMember]
public string ErrorString = "错误信息未初始化...";
}
Result结构中用到的ErrorCodeValue枚举集合如下:
[DataContract(Namespace = "http://dp2003.com/dp2kernel/")]
public enum ErrorCodeValue
{
[EnumMember]
NoError = 0, // 没有错误
[EnumMember]
CommonError = 1, // 一般性错误
[EnumMember]
NotLogin = 2, // 尚未登录
[EnumMember]
UserNameEmpty = 3, // 用户名为空
[EnumMember]
UserNameOrPasswordMismatch = 4, // 用户名或者密码错误
[EnumMember]
NotHasEnoughRights = 5, // 没有足够的权限
[EnumMember]
TimestampMismatch = 9, //时间戳不匹配
[EnumMember]
NotFound = 10, //没找到记录
[EnumMember]
EmptyContent = 11, //空记录
[EnumMember]
NotFoundDb = 12, // 没找到数据库
[EnumMember]
PathError = 14, // 路径不合法
[EnumMember]
PartNotFound = 15, // 通过xpath未找到节点
[EnumMember]
ExistDbInfo = 16, //在新建库中,发现已经存在相同的信息
[EnumMember]
AlreadyExist = 17, //已经存在
[EnumMember]
AlreadyExistOtherType = 18, // 存在不同类型的项
[EnumMember]
ApplicationStartError = 19, // 应用程序启动错误
[EnumMember]
NotFoundSubRes = 20, // 部分下级资源记录不存在
[EnumMember]
Canceled = 21, // 操作被放弃
[EnumMember]
AccessDenied = 22, // 权限不够
}
以上这些结构都是在dp2Kernel中定义的(dp2Library中只是沿用、引用了这些定义)。
2023/2/8-注:GetSearchResult() API 增加的(dp2library 本地)排序功能,需测试是不是也正确实现了字段按照账户权限过滤。非排序功能,是改造和测试过了的;但排序功能还没有验证过。
检索指纹
id,cols,format:cfgs/browse_fingerprint