سؤال

وفيما يلي هيكل شمل - (لقد أعطيت قطعة صغيرة جدا من الوثيقة بأكملها مع بيانات محدودة.لدي ديسيبل شمل من 6 غيغابايت ، مع مؤشر النص الكامل المناسب.)

<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>

الآن أريد كل هؤلاء Chap العقد التي تحتوي على جميع الكلمات" الإدارات " ، " التحقيق "و"تقرير".

حتى الآن ، لا يمكنني الحصول عليها باستخدام مجموعات مختلفة.واحدة من محاولتي هي -

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

يمكن لأي هيئة دليل لي على هذا ?

هل كانت مفيدة؟

المحلول

يشير فهرس النص الكامل لباسكس إلى جميع المصطلحات على مستوى عقدة النص.هذا يعني أن كل كلماتك يجب أن تحدث في نفس عقدة النص.

إذا كنت ترغب في الاستفادة من استعلام النص الكامل والعثور على جميع الكلمات التي تحدث أسفل عنصر معين ، فيمكنك تجربة الاستعلام التالي:

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

الأول contains text سيتم إعادة كتابة التعبير إلى طلب فهرس.سيعيد جميع النصوص التي تعيد أيا من الكلمات التي تم البحث عنها.يحتوي على تعبير نصي في where سوف جملة تصفية كافة العقد التي لا تحتوي على كافة شروط الاستعلام الخاص بك.مع string-join(.//text(), ' '), ، سيتم تسلسل جميع العقد النصية أسفل عنصر المستند ، وسيتم إجراء البحث على السلسلة المرتبطة.

يجب أن يؤدي التمثيل المتكافئ للاستعلام إلى نفس النتائج:

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

نصائح أخرى

ft:search, ، ولماذا لن يحل المشكلة

من خلال النظر إلى باسيكس ' كسكيري وثائق النص الكامل سوف ندرك أن الحجة الثانية في ft:search يجب أن تكون سلسلة من الكلمات:

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

لذلك ، يجب أن يبدو الاستعلام الخاص بك مثل

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

ومع ذلك ، فإن هذا لا يزال لن يحل مشكلتك ، لأن هذه الوظيفة

[إعادة]يحول جميع العقد النصية من فهرس النص الكامل لقاعدة البيانات $db التي تحتوي على المحدد $terms.

وبعبارة أخرى:يجب أن تحدث كل هذه الكلمات في عقدة نصية واحدة ، ولكنها موزعة على عدة في إدخال المثال الخاص بك (في جميع أنحاء <Doc/> عقدة).

باستخدام النص الكامل كسكيري القياسية

كان علي أن أخمن من المدخلات والكلمات التي تبحث عنها والتي تريد البحث عنها بالفعل <Doc/> العقد التي تحتوي على كل هذه الكلمات الثلاث.

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

سيؤدي هذا إلى استرداد جميع المستندات وتطبيق بحث نصي كامل عليها وإرجاع عقدة فصل المستند في النهاية.

كن على علم

  • لقد أزلت حرف بدل مساحة الاسم ، حيث لم يتم تضمين مساحات أسماء في مستند المثال الخاص بك و
  • لإنشاء فهرس نص كامل (إذا لم تقم بذلك بعد) مما سيزيد من الأداء بشكل كبير.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top