2016-09-01 4 views
0

У меня есть запрос для извлечения автозаполнения из XML, он отлично работает в течение 3 или более символов .. но очень медленно в течение 1 или 2-х символов ..поиска Cts медленно в течение одного или двух символов

Вот 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> 

Есть ли способ сортировки во время поиска ??

ответ

2

Search Developer's Guide рекомендует комбинировать trailing wildcard searches с word lexicon. У вас также есть параметры three/two/one character searches, которые вы еще не включили, но для этого потребуется значительное дополнительное дисковое пространство.

Но я боюсь, что индексы и лексиконы MarkLogic не особенно оптимизированы для этого варианта использования. Вы можете получить значения frequency-order и item-order непосредственно из диапазонных индексов, используя cts:values, но не значения, упорядоченные по длине. Если бы это было так, вы могли бы использовать это с помощью cts:index-order, чтобы применить сортировку к вашему cts:search.

Я бы рекомендовал взглянуть на cts:value-match и применить это к вашему элементу suggestion. Для этого потребуется только индекс диапазона и дальнейшие настройки. Он также не будет вытаскивать фактические фрагменты с диска, такие как cts:search, и полностью выполнять данные из памяти. Скорее всего, это будет быстрее.

HTH!

+0

Но результаты, которые я хочу, должны сортироваться по длине в порядке возрастания, как я могу достичь этого с помощью cts: value-match? – Atiq

+0

Как и сейчас, используя инструкцию FLWOR вокруг 'cts: value-match'. Таким образом, вы по существу только заменяете 'cts: search' на' cts: value-match' .. – grtjn