我有一个从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>
有没有办法在搜索过程中进行排序?
答案 0 :(得分:2)
Search Developer's Guide建议将trailing wildcard searches
与word lexicon
合并。您还有three/two/one character searches
个可能尚未启用的选项,但它们需要大量的额外磁盘空间。
但我担心MarkLogic索引和词典并未针对此用例进行特别优化。您可以使用cts:values
直接从范围索引获取frequency-order
和item-order
值,但不能按长度排序值。如果愿意,您可以使用cts:index-order
对cts:search
进行排序。
我建议您查看cts:value-match
,然后将其应用于suggestion
元素。它只需要一个范围索引,而不需要进一步设置。它也不会像cts:search
那样从磁盘中提取实际片段,而是完全从内存数据中运行。这可能会更快..
HTH!