Marklogic cts:element-child-geospatial-query很慢但不需要索引?

时间:2014-05-22 19:28:26

标签: search twitter marklogic

嗨Markloggers在那里,

我遇到了一个奇怪的情况。 到目前为止,我的经验是我需要为cts设置一个特定的索引:函数表现良好。现在我需要在de db中搜索地理标记的推文我使用以下查询。 似乎我不需要为cts制作特定的索引:element-child-geospatial-query()运行,但性能很差......我在这里缺少什么?

查询

xquery version "1.0-ml";
declare namespace j = "http://marklogic.com/xdmp/json/basic";

let $lon := 5.470047
let $lat := 51.819565
let $radius := 5.0

let $point := cts:point($lon, $lat)

let $circle := cts:circle($radius,$point)
(:
let $pattern := "/twitter/*"         
let $pointSource := cts:uri-match($pattern)  
:)

(: give back all tweet ids in the circle :)
let $codes := for $p in cts:search(fn:doc(), cts:element-child-geospatial-query(xs:QName("j:geo"), xs:QName("j:point"), $circle))
    return $p//j:id

return fn:count($codes)

一百万条必须遵循其中元素的推文:

<json type="object" xmlns="http://marklogic.com/xdmp/json/basic">
... other stuff ...
<dikwmetadata type="object">
<source type="string">
twitter_nederland
</source>
<timestamp type="string">
2014-03-11T21:19:03.818547
</timestamp>
<data xmlns:j="http://marklogic.com/xdmp/json/basic">
<point_was_tried>
2014-03-11T21:19:03.835457+01:00
</point_was_tried>
<postalcode_was_tried>
2014-03-11T21:19:03.835457+01:00
</postalcode_was_tried>
<geo lastupdate="">
<point>
4.65407742 , 52.28828829
</point>
</geo>
<tags lastupdate=""/>
<postalcodes lastupdate="">
<postal_code>
2135
</postal_code>
</postalcodes>
</data>
</dikwmetadata>
</json>

我们将元素范围索引type = string添加到geo和point元素但没有改进......

现在回应60秒......

任何提示?

雨果

2 个答案:

答案 0 :(得分:2)

地理空间索引与范围索引分开。您可以在Admin&gt;中创建它们。数据库&gt; DB-Name&gt;地理空间索引。

除了运行未经过滤的查询之外,如果您只想计算匹配片段的数量,那么您可以使用xdmp:estimate代替count

xdmp:estimate(cts:search(...))

答案 1 :(得分:1)

你可以考虑做cts:搜索未经过滤的 cts:search(fn:doc(),cts:element-child-geospatial-query(xs:QName(&#34; j:geo&#34;),xs:QName(&#34; j:point&#34; ),$ circle),(&#34;未经过滤的&#34;))
这只会通过索引而不是实际验证每次点击。