我有一个包含大量文档的集合。
当我搜索集合时,我需要获取独立于文档的匹配列表。因此,如果我搜索" 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("/foo.xml")" score="328"
confidence="0.807121" fitness="0.901397">
<search:snippet>
<search:match path="fn:doc("/foo.xml")/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
,您可以遍历所有结果并提取每个匹配的单词,这将相对容易做到。你会在每场比赛中呈现什么?它周围的片段?
请记住,您要求的内容可能需要很长时间才能执行。