Frage

Es folgt die XML-Struktur – (ich habe einen sehr kleinen Teil des gesamten Dokuments mit begrenzten Daten angegeben.Ich habe eine XML-Datenbank von 6 GB mit dem richtigen VOLLSTÄNDIGEN TEXT-Index.)

<Docs>
 <Doc>
<Chap>No - 1</Chap>
<Desc>
  <Notes>
    <Para t="sn">departmental report</Para>
  </Notes>
  <Notes>
    <Para t="sn">The equiry commission is good.</Para>
  </Notes>
  <Notes>
    <Para t="sn">departmental process</Para>
    <Para t="ln">The enquiry report for the bomb blast is yet to come.<bL/>
      <bL/>The department working on this is quite lazy.</Para>
  </Notes>
</Desc>
</Doc>
<Doc>
<Chap>No - 2</Chap>
<Desc>
  <Notes>
    <Para t="sn">Enquiry Processes Report</Para>
    <Para t="ln">The enquiry process is very simple.<bL/>
      <bL/>With proper guidance anybody can handle the commission easily.<bL/>
      <bL/>
    </Para>
  </Notes>
  <Notes>
    <Para t="sn">Enquiry - Departmental</Para>
  </Notes>
</Desc>
 </Doc>
 <Doc>
<Chap>No - 3</Chap>
<Desc>
  <Notes>
    <Para t="sn">Physics Department</Para>
  </Notes>
  <Notes>
    <Para t="sn">Working process of physics department is quite lengthy</Para>
    <Para t="ln">Even after proper enquiry, I was told nothing.<bL/>
      <bL/>This was like a bomb blast.</Para>
  </Notes>
  <Notes>
    <Para t="sn">Departmental enquiry.</Para>
    <Para t="ln">There should be a departmental enquiry for this wrong process.</Para>
  </Notes>
</Desc>
</Doc>
</Docs>

Jetzt will ich das alles Chap Knoten, die alle Wörter „Abteilung“, „Anfrage“ und „Bericht“ enthalten.

Bisher ist es mir nicht gelungen, sie in verschiedenen Kombinationen zu erhalten.Einer meiner Versuche ist -

for $x in ft:search("Docs", ("departmental enquiry report"), map{'mode':='all words'})/ancestor::*:Para
 return $x/ancestor::Chap

Kann mir irgendjemand dabei helfen?

War es hilfreich?

Lösung

Der Volltextindex von BaseX referenziert alle Begriffe auf Textknotenebene.Das bedeutet, dass alle Ihre Wörter im selben Textknoten vorkommen müssten.

Wenn Sie die Volltextabfrage nutzen und alle Wörter finden möchten, die unter einem bestimmten Element vorkommen, können Sie die folgende Abfrage ausprobieren:

let $words := ("departmental enquiry report")
for $doc in db:open("Docs")//Doc[.//text() contains text { $words } any word]
where $doc[string-join(.//text(), ' ') contains text { $words } all words]
return $doc/Chap

Der erste contains text Der Ausdruck wird in eine Indexanforderung umgeschrieben.Es werden alle Texte zurückgegeben, die eines der gesuchten Wörter enthalten.Der enthält einen Textausdruck im where Die Klausel filtert alle Knoten heraus, die nicht alle Ihre Abfragebegriffe enthalten.Mit string-join(.//text(), ' '), werden alle Textknoten unterhalb des Doc-Elements verkettet und die Suche wird für die verbundene Zeichenfolge durchgeführt.

Die folgende, äquivalente Darstellung der Abfrage sollte zu denselben Ergebnissen führen:

let $words := ("departmental enquiry report")
for $x in ft:search("Docs", $words, map { 'mode': 'any word' })/ancestor::*:Doc
where ft:contains(string-join($x//text(), ' '), $words, map { 'mode': 'all words' })
return $x/Chap

Andere Tipps

ft:search, und warum das Problem dadurch nicht gelöst wird

Durch Anschauen BaseX' XQuery-Volltextdokumentation Sie werden feststellen, dass das zweite Argument in ft:search sollte eine Folge von Wörtern sein:

ft:search($db as xs:string, $terms as item()*, $options as item()) as text()*

Ihre Anfrage sollte also etwa so aussehen:

for $x in ft:search("Docs", ("departmental", "enquiry", "report"), map{'mode':='all words'})/ancestor::*:Para
return $x/ancestor::Chap

Dennoch wird dies Ihr Problem nicht lösen, da diese Funktion

[re]wandelt alle Textknoten aus dem Volltextindex der Datenbank um $db die das angegebene enthalten $terms.

Mit anderen Worten:Alle diese Wörter müssten in einem einzigen Textknoten vorkommen, in Ihrer Beispieleingabe sind sie jedoch über mehrere verteilt (über einen <Doc/> Knoten).

Verwendung von Standard-XQuery-Volltext

Ich musste anhand der Eingaben und Wörter, nach denen Sie suchen, erraten, nach welchen Sie tatsächlich suchen möchten <Doc/> Knoten, die alle diese drei Wörter enthalten.

for $document in doc("Docs")/Docs/Doc
where $document contains text { 'departmental', 'enquiry', 'report' } all words
return $document/Chap

Dadurch werden alle Dokumente abgerufen, eine Volltextsuche darauf angewendet und schließlich der Kapitelknoten des Dokuments zurückgegeben.

Sei vorsichtig

  • Ich habe den Namespace-Platzhalter entfernt, da in Ihrem Beispieldokument keine Namespaces enthalten sind
  • um einen Volltextindex zu erstellen (falls Sie dies noch nicht getan haben), was die Leistung erheblich steigert.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top