Cts搜索速度慢一个或两个字符

时间:2016-09-01 05:35:00

标签: performance xquery marklogic

我有一个从xml中获取autosuggest的查询,它适用于3个或更多字符..但对于1或2个字符来说非常慢..

这是我正在使用的xquery,任何更正都会受到赞赏..

xquery version "1.0-ml";

declare default function namespace "local";
declare default collation "http://marklogic.com/collation/en/S1";
declare variable $search-term := xdmp:get-request-field("query", "b");

declare function getWildCardedTerm($term as xs:string) as xs:string*{
    (fn:concat($search-term, "*"),fn:concat("* ",$search-term))
};

let $terms := getWildCardedTerm($search-term)

let $values := cts:search(//searchLabel,cts:and-query((cts:collection-query(("/collections/autosuggest")), cts:element-word-query(xs:QName("suggestion"),$terms))) )

let $suggestionsOrderedByLength := for $value in $values
order by fn:string-length($value//altLabel/text()), $value/altLabel/text()
return $value

return <suggestions>{$suggestionsOrderedByLength[1 to 10]}</suggestions>

有没有办法在搜索过程中进行排序?

1 个答案:

答案 0 :(得分:2)

Search Developer's Guide建议将trailing wildcard searchesword lexicon合并。您还有three/two/one character searches个可能尚未启用的选项,但它们需要大量的额外磁盘空间。

但我担心MarkLogic索引和词典并未针对此用例进行特别优化。您可以使用cts:values直接从范围索引获取frequency-orderitem-order值,但不能按长度排序值。如果愿意,您可以使用cts:index-ordercts:search进行排序。

我建议您查看cts:value-match,然后将其应用于suggestion元素。它只需要一个范围索引,而不需要进一步设置。它也不会像cts:search那样从磁盘中提取实际片段,而是完全从内存数据中运行。这可能会更快..

HTH!