如何将SOLR特殊Filter Query URL解析为规范JavaScript对象?
SOLR Filter Query URL 解析方案
需求说明
我们在SOLR中使用如下格式的Filter Query URL:
?pageSize=30¤tPage=0&q=blahblah:relevance,sortingNumber-asc:productgroup:houseHoldSoap:soapVariant:TMZ:lengthToBeginningOfEdge:381.0-to-381.0
需要将其解析为结构规范的JavaScript对象,目标结构如下:
{ pageSize: 30, currentPage: 0, sorting: ["relevance", "sortingNumber-asc"], filterQuery: [ {"productgroup": "houseHoldSoap"}, {"soapVariant": "TMZ"}, {"lengthToBeginningOfEdge": "381.0-to-381.0" } ] }
此前尝试自行编写解析器,但因URL语法复杂(键值对与排序值混用冒号分隔)难以实现,现需要可直接传入URL字符串并返回上述规范对象的JavaScript函数。
自定义解析函数
由于该URL格式属于自定义的SOLR查询参数组合,暂无现成工具库直接支持,以下是针对性的解析函数:
function parseSolrFilterUrl(urlStr) { // 解析URL查询参数 const urlParams = new URLSearchParams(urlStr); const result = { pageSize: parseInt(urlParams.get('pageSize'), 10), currentPage: parseInt(urlParams.get('currentPage'), 10), sorting: [], filterQuery: [] }; const qValue = urlParams.get('q'); if (!qValue) return result; // 拆分q参数,忽略前缀"blahblah:",处理后续内容 const qParts = qValue.split(':'); const contentSegments = qParts.slice(1); // 提取排序规则:第一个分段是逗号分隔的排序项 result.sorting = contentSegments[0].split(','); // 提取过滤条件:剩余分段按"键:值"成对分组 const filterSegments = contentSegments.slice(1); for (let i = 0; i < filterSegments.length; i += 2) { if (i + 1 < filterSegments.length) { result.filterQuery.push({ [filterSegments[i]]: filterSegments[i + 1] }); } } return result; } // 测试示例 const testUrl = '?pageSize=30¤tPage=0&q=blahblah:relevance,sortingNumber-asc:productgroup:houseHoldSoap:soapVariant:TMZ:lengthToBeginningOfEdge:381.0-to-381.0'; console.log(parseSolrFilterUrl(testUrl));
函数说明
- 利用
URLSearchParams快速解析URL中的顶级参数(pageSize、currentPage); - 拆分
q参数,忽略固定前缀blahblah:; - 从拆分后的分段中提取逗号分隔的排序规则,存入
sorting数组; - 将剩余分段按“键-值”成对分组,生成
filterQuery数组中的对象。
内容的提问来源于stack exchange,提问作者Stefan Brendle
相关产品推荐
相关产品推荐

