如何从Marks中的cts:search()获取所有命中

时间:2012-06-08 13:55:50

标签: search marklogic cts

我有一个包含大量文档的集合。

当我搜索集合时,我需要获得一个独立于文档的匹配列表。所以,如果我搜索“pie”这个词。我会找回一份文件清单,按相关性进行适当排序。但是,其中一些文档在多个地方包含“pie”一词。我想找回所有匹配项的列表,与找到匹配项的文档无关。此外,所有命中列表都需要按相关性(权重)排序,同样完全独立于文档(未按文档分组)。

按照代码搜索并返回按文档分组的匹配...

let $searchfor := "pie"

let $query := cts:and-query((
  cts:element-word-query(xs:QName("title"), ($searchfor), (), 16),
  cts:element-word-query(xs:QName("para"), ($searchfor), (), 10)
))

let $resultset := cts:search(fn:collection("docs"), $query)[0 to 100]
for $n in $resultset
  return cts:score($n)

我需要$n成为“match-node”,而不是“document-nod e”......

谢谢!

4 个答案:

答案 0 :(得分:1)

文档相关性由TFIDF确定。匹配有助于文档的分数,但没有相对于彼此的分数。 cts:search已经返回按文档相关性排序的结果,因此您可以执行此操作以获取按其祖先文档分数排序的匹配节点:

let $searchfor := "pie"
let $query := cts:and-query((
  cts:element-word-query(xs:QName("title"), ($searchfor), (), 16),
  cts:element-word-query(xs:QName("para"), ($searchfor), (), 10)
))
return
cts:search(//(title|para),$query)[0 to 100]/cts:highlight(.,$query,element match {$cts:node})//match/*

答案 1 :(得分:0)

我建议您查看Search APIhttp://community.marklogic.com/pubs/5.0/books/search-dev-guide.pdfhttp://community.marklogic.com/pubs/5.0/apidocs/SearchAPI.html)。此API将提供您想要的,提供匹配节点以及实际文档的URI。您还应该发现在一般情况下使用它更容易,尽管会出现需要恢复到cts:search的边缘情况。

search:search是您要使用的特定功能。它会给你回复类似的答案:

    <search:response total="1" start="1" page-length="10" xmlns=""
    xmlns:search="http://marklogic.com/appservices/search">
  <search:result index="1" uri="/foo.xml" 
        path="fn:doc(&quot;/foo.xml&quot;)" score="328" 
        confidence="0.807121" fitness="0.901397">
    <search:snippet>
        <search:match path="fn:doc(&quot;/foo.xml&quot;)/foo">
            <search:highlight>hello</search:highlight></search:match>
    </search:snippet>
  </search:result>
  <search:qtext>hello sample-property-constraint:boo</search:qtext>
  <search:report id="SEARCH-FLWOR">(cts:search(fn:collection(), 
      cts:and-query((cts:word-query("hello", ("lang=en"), 1), 
      cts:properties-query(cts:word-query("boo", ("lang=en"), 1))), 
      ()), ("score-logtfidf"), 1))[1 to 10]
  </search:report>
  <search:metrics>
    <search:query-resolution-time>PT0.647S</search:query-resolution-time>
    <search:facet-resolution-time>PT0S</search:facet-resolution-time>
    <search:snippet-resolution-time>PT0.002S</search:snippet-resolution-time>
    <search:total-time>PT0.651S</search:total-time>
  </search:metrics>
</search:response>

在这里,您可以看到每个结果都定义了一个或多个匹配元素。

答案 2 :(得分:0)

您如何确定独立于文档的单词的相关性?相关性是文档相关性的衡量标准,而不是文字相关性。我不知道如何测量单词的相关性。

您可能会返回按文档相关性排序的所有单词,然后返回“document order”中每个文档的单词,这意味着它们在文档中的显示顺序。使用search:search可以相对容易,您可以迭代所有结果并提取每个匹配的单词。你会在每场比赛中出现什么?它周围的片段?

请记住,您所要求的内容可能需要很长时间才能执行。

答案 3 :(得分:0)

您需要将文档(将其分段)拆分为较小的文档。每个textnode都可以是一个文档,带有一个存储的原始xpath,这样上下文就不会丢失。