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



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

当我搜索集合时,我需要获取独立于文档的匹配列表。因此,如果我搜索" 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"......

谢谢!

文档相关性由 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/*

您需要将文档拆分(将其片段化)为较小的文档。每个文本节点都可以是一个文档,并存储了一个原始 xpath,这样上下文就不会丢失。

我建议您查看Search API(http://community.marklogic.com/pubs/5.0/books/search-dev-guide.pdf 和 http://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>

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

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

您可以返回按文档相关性排序的所有单词,然后返回"document order"中每个文档的单词,这意味着它们在文档中出现的顺序。对于search:search,您可以遍历所有结果并提取每个匹配的单词,这将相对容易做到。你会在每场比赛中呈现什么?它周围的片段?

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

相关内容

最新更新