Мне пришлось добавить возможность геопространственного поиска в уже существующее приложение, которое использует поиск: API поиска и имеет полнотекстовый поиск и фасетный поиск. Я читал о расширении API поиска, но сейчас у меня просто нет времени. Итак, я подумал, что адаптирую свой код, чтобы просто выполнить пересечение двух наборов результатов (один возвращается API-интерфейсом search:search, а другой возвращается cts:search
, который позволяет cts:polygon
искать). К сожалению, пересечение сильно снижает время выполнения. Есть ли лучший способ оптимизировать или ускорить следующее выражение ниже?
$results_fts//search:result[./search:metadata/Vhe eq $geo_results//root/Vhe]
Вот мой код:
declare variable $geo_results :=
let $qr := cts:search(doc(), cts:and-query(($q-geospatial,
cts:word-query("*", ("case-insensitive","whitespace-insensitive","wildcarded","diacritic-insensitive")) )) ) (:Search all * within the polygon:)
return $qr;
declare variable $results_fts :=
let $qrs := search:search($q-text, $options, xs:unsignedLong(xdmp:get-request-field("start","1")), 12000) (:max page length to get all records:)
return $qrs;
declare variable $results :=
let $qrt := if (xdmp:get-request-field("map-code")) then
(:intersect geospatial search with the full text search:)
<search:response>
{ $results_fts//search:result[./search:metadata/Vhe eq $geo_results//root/Vhe] }
{ $results_fts//search:facet }
{ $results_fts//search:qtext }
{ $results_fts//search:metrics }
</search:response>
else $results_fts
return $qrt;