0

我正在使用搜索不支持分页/限制的 XML API。推荐的方法是只请求所有 ID,然后在第二个请求中获取数据并自行处理分页。

第一个请求:

http://example.com?search=foobar&columns=ID

<results>
  <item><id>1</id></item>
  <item><id>2</id></item>
  <item><id>3</id></item>
  <item><id>4</id></item>
  <item><id>5</id></item>
  <item><id>6</id></item>
  <item><id>7</id></item>
  <item><id>8</id></item>
  <item><id>9</id></item>
  <item><id>10</id></item>
</results>

第二个请求:

http://example.com?search=1,2,3,4,5&columns=ID,title,description

<results>
  <item><id>1</id><title>foobar</title><description /></item>
  <item><id>2</id><title>foobar</title><description /></item>
  <item><id>3</id><title>foobar</title><description /></item>
  <item><id>4</id><title>foobar</title><description /></item>
  <item><id>5</id><title>foobar</title><description /></item>
</results>

YQL 是否可以将其组合成一个带有搜索结果计数和分页支持的请求?

4

2 回答 2

0

从文档中我没有直接的方法,但你可以这样做:

1) 创建查询 http://example.com?search=foobar&columns=ID 的 YQL 表 A 2) 创建查询http://example.com?search=1,2,3,4,5&columns 的 YQL 表B =ID,title,description 3) 现在,创建一个 YQL 表 C,它对 A 和 B 的连接执行 y.query,如下所示:

select * from B where search in (select ids from A where search="foobar")

当然,查询语法会根据表名和其中定义的键而改变。有关 YQL 连接的更多信息,请参阅此处

希望这很清楚,如果您在这种情况下找到更好的东西,请告诉我:)

于 2012-11-29T18:27:33.997 回答
0

创建一个带有分页的 YQL 表:

<paging model="offset" matrix="true">  
    <start id="internalIndex" default="0" />  
    <pagesize id="internalPerPage" max="250" />
</paging>

使用 Javascript 来处理两个提取和分页:

var internalIndex = parseInt( request.matrixParams['internalIndex'] );
var internalPerPage = parseInt( request.matrixParams['internalPerPage'] );

var interimURL = 'http://example.com?columns=ID';
interimURL += '&search=' + request.queryParams['search'];
var interimQueryParameter = {url:interimURL};
var interimQuery = y.query("SELECT * FROM xml WHERE url=@url", interimQueryParameter);

var rows = interimQuery.results.*;

// get subset
var xml    = rows;//this.copy(); // clone XML
var from = internalIndex;
var to = ((from + internalPerPage) < xml.length()) ? (from + internalPerPage) : xml.length();
var sliced = [];
for (; from < to; from++) {
    sliced.push(xml[from].@["ID"]);
}

var finalURL = 'http://example.com?';
finalURL += '&search=' + sliced.join(",");
finalURL += "&columns=ID,title,description"
var finalQueryParameter = {url:finalURL};
var finalQuery = y.query("SELECT * FROM xml WHERE url=@url", finalQueryParameter);

var finalResults = finalQuery.results.response;
finalResults.node += <internalCurserPositon>{internalIndex}</internalCurserPositon>
finalResults.node += <internalCount>{rows.length()}</internalCount>

response.object = finalResults;
于 2012-12-05T20:53:41.820 回答