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