2013-08-15 12 views
5

Używam funkcji wyszukiwania marklogic do tworzenia strony wyszukiwania. W tej chwili używam XQuery, aby uzyskać wyniki wyszukiwania przez search:search. Jako przykład szkielety, zobacz ten kod:Relacje danych jako kontekst wyszukiwania w Marklogic

xquery version "1.0-ml"; 
import module namespace search = "http://marklogic.com/appservices/search" 
     at "/MarkLogic/appservices/search/search.xqy"; 

search:search('test', 
    <options xmlns='http://marklogic.com/appservices/search'></options>) 

Ten szukane wszystkie treści w bazie danych, która jest w porządku w wielu przypadkach. W innych przypadkach szukam w oparciu o kolekcje z numerem cts:collection-query. Kolekcje służą jako świetne konteksty dla moich wyszukiwań.

Teraz chciałbym ograniczyć moje wyniki wyszukiwania w oparciu o związek danych w "głównym" dokumencie. Ten "główny" dokument ma wszystkie relacje w modelu obiektowym. Jeśli ten model obiektowy ma odniesienie do dokumentu, chcę, aby ten dokument był uwzględniony w wyszukiwaniu. Zasadniczo dokumentem "głównym"/modelem jest kontekst wyszukiwania.

Próbowałem przeprowadzić burzę mózgów pomysłów na najlepszy sposób na to. Oto co mam wymyślić do tej pory, ale miałem nadzieję, kogo bardziej zaznajomieni z Marklogic (ja tylko pracuję z nim przez 6 miesięcy) może prowadzić do mnie w dobrym kierunku:

  1. dodać wszystkie dokumenty odniesienie w dokumencie modelu do unikatowej kolekcji. Następnie wyszukaj zapytanie na podstawie tej kolekcji. Jednak kolekcje będą musiały zostać zaktualizowane po zmianie modelu.
  2. Załaduj dokument modelu do mojego kodu i uzyskaj listę wszystkich odniesień i dodaj je do zapytania przez cts:document-query (lub temu podobne).
  3. Restrukturyzuj moją koncepcję "modelu" w jakiś sposób w moich dokumentach XML.

Dzięki za wszelkie uwagi lub sugestie.

+1

Skończyło się na pierwszym numerze # 1. # 2 było około 3 razy wolniejsze w mojej bazie danych. Również ze względu na rozległy model relacji w moim XML, kod dla numeru 2 zaczynał być brzydki. Dzięki istniejącym kolekcjom mogę pozwolić wszystkim programistom na łatwe ponowne użycie. Najprawdopodobniej zaimplementuję wyzwalacze w przyszłości. – Paul

Odpowiedz

2

Wszystkie te pomysły sprawdziłyby się dobrze. Decyzja, które z nich należy zastosować, zależy od danych szczegółowych aplikacji, takich jak częstotliwość zmiany głównego dokumentu (i czy masz nad nim kontrolę), , jak trudno jest zmienić kod XML.

Inną rzeczą, o której należy pamiętać, jest ustawienie wyzwalacza dla aktualizacji dokumentów, które mogą automatycznie przeprowadzić zmiany kolekcji.

-David Lee

+0

Podoba mi się pomysł dodania wyzwalacza. – Paul

3

chciałbym zacząć (2) i sprawdzić, czy wydajność jest wystarczająco dobra. To będzie zależeć od twojego przypadku użycia, ale oczekuję, że powinno to być dobre dla tysięcy, a nawet setek tysięcy referencji.

Należy użyć terminu pojedynczego cts:document-query($list-of-references). To będzie szybsze niż cts:or-query(for $ref in $list-of-references return cts:document-query($ref)), ponieważ wyszukiwanie indeksu może być pojedynczym przejściem zamiast N osobnymi odnośnikami.

Powiązane problemy