【问题标题】:Marklogic Wrong count and Facet result XqueryMarklogic 错误计数和 Facet 结果 Xquery
【发布时间】:2012-09-15 07:56:22
【问题描述】:

调用 search:search 不会返回预期的方面结果计数。下面是两个示例文件和我使用的代码。

Page1.xml

<pages xmlns="http://marklogic.com/docs">
  <page>
    <elementNode>data1</elementNode>
    <textNode>text1</textNode>
  </page>
  <page>
    <elementNode>data2</elementNode>
    <textNode>text2</textNode>
  </page>
  <page>
    <elementNode>data3</elementNode>
    <textNode>text3</textNode>
  </page>
  <page>
    <elementNode>data4</elementNode>
    <textNode>text4</textNode>
  </page>
</pages>

Page2.xml

<pages xmlns="http://marklogic.com/docs">
  <page>
    <elementNode>data5</elementNode>
    <textNode>text5</textNode>
  </page>
  <page>
    <elementNode>data6</elementNode>
    <textNode>text6</textNode>
  </page>
  <page>
    <elementNode>data7</elementNode>
    <textNode>text7</textNode>
  </page>
  <page>
    <elementNode>data8</elementNode>
    <textNode>text8</textNode>
  </page>
</pages>

我还在&lt;elementNode&gt; 上创建了一个元素范围索引。现在我使用 searchText "text1"

执行了以下 XQuery
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
declare namespace ts= "http://marklogic.com/docs";

import module namespace search ="http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

declare variable $options :=  
  <options xmlns="http://marklogic.com/appservices/search">
    <searchable-expression xmlns:ex="http://marklogic.com/docs">//ex:page</searchable-expression>
    <grammar>
      <starter strength="30" apply="grouping" delimiter=")">(</starter>
      <starter strength="40" apply="prefix" element="cts:not-query">NOT</starter>
      <joiner strength="10" apply="infix" element="cts:or-query" tokenize="word">OR</joiner>
      <joiner strength="20" apply="infix" element="cts:and-query" tokenize="word">AND</joiner>
      <joiner strength="50" apply="constraint">:</joiner>
    </grammar>
    <constraint name="elementNode">
      <range collation="http://marklogic.com/collation/" type="xs:string">
        <facet-option>limit=1000</facet-option>
        <element ns="http://marklogic.com/docs" name="elementNode"/>
        <searchable-expression xmlns:ex="http://marklogic.com/clover/docs-xml">//ex:elementNode</searchable-expression>
      </range>
    </constraint>
  </options>;

let $searchResult := search:search("text1", $options)
return $searchResult

产生这个结果:

<search:response xmlns="" xmlns:search="http://marklogic.com/appservices/search">
  <search:result index="1" uri="Page1.xml" path="fn:doc(&quot;Page1.xml&quot;)/*:pages/*:page[1]">
    <search:snippet>
      <search:match path="fn:doc(&quot;Page1.xml&quot;)/*:pages/*:page[1]/*:textNode">
        <search:highlight>text1</search:highlight>
      </search:match>
    </search:snippet>
  </search:result>
  <search:facet name="elementNode">
    <search:facet-value name="data1" count="1">data1</search:facet-value>
    <search:facet-value name="data2" count="1">data2</search:facet-value>
    <search:facet-value name="data3" count="1">data3</search:facet-value>
    <search:facet-value name="data4" count="1">data4</search:facet-value>
  </search:facet>
</search:response>

现在我在facet-result 中发现了一个问题。它应该只返回一个方面值,即 page1 中的 data1,因为只有 page1 具有所需的搜索表达式“text1” .取而代之的是 facet-result 给我整个文档中所有 textNode 值的结果。请帮助我 - 我们如何限制这一点?另外,count 给了我整个文档,但我想要的是页数匹配。

【问题讨论】:

  • 你能给我们看看相关的 XQuery 代码吗?
  • @grtjn 我已经提供了示例代码,感谢您的回复。
  • 抱歉,一定是忽略了滚动条。有点大的代码示例,我把它分块了..

标签: marklogic


【解决方案1】:

索引指向文档或片段,而不是元素。这类似于 RDBMS,其中索引指向行。您的示例 XML 和代码表明您将每个文档视为关系表。而是将文档视为行。

如果示例代码与实际应用程序相似,我可能会重构文档,以便每个“页面”元素都成为自己的文档。

此外,使用http://marklogic.com/docs 之类的命名空间创建自己的内容也是一种不好的做法。 MarkLogic 可能决定在将来的某个版本中使用该名称空间,这可能会给您带来问题。选择一个您有合理期望控制的命名空间。

【讨论】:

  • 感谢您的快速回复,我理解您对错误命名空间的看法,但它不是在实际应用中,它只是在此示例代码中,也是由于不可避免的原因,我无法按照您的建议重构文档是否有任何获取给定搜索查询的所有当前 elementNode 索引计数的其他方法。我真的提前感谢了。
【解决方案2】:

您使用可搜索表达式,这会导致搜索结果被分配给这些元素。不幸的是,正如 mblakele 所解释的那样,分面计数并非如此。他将页面元素放在自己的文档中的建议是这里两种可能的解决方案之一。另一种是将页面元素定义为片段根。您可以在 MarkLogic 的管理界面中执行此操作。您可以在数据库属性中找到它。

HTH!

【讨论】:

  • 谢谢它在配置后按预期工作,现在我得到每页的计数和方面。是否有任何设置可以让我动态使用它,因为用户可以选择在整个 xml [页面下] 或页面片段上进行搜索?
  • @user1660340 不完全有信心,但您可以尝试从搜索选项中动态删除可搜索表达式,这或多或少应该具有您正在寻找的效果。更改碎片需要重新索引,因此无法在“运行时”完成..
  • 即使您在运行时更改了可搜索的表达式,索引仍然会指向碰巧的片段。这将影响构面计数等。要同时使用这两种方式,您必须以两种方式存储内容:作为页面级文档和多页文档。这是可能的,但实施起来可能很棘手。您可能需要将完整的文档存储在一个命名空间下,将页面级文档存储在另一个命名空间下,每个文件都有一个字段。
  • @grtjn :我尝试了您在运行时删除 searchble-expression 的选项,但正如 mblakele 所解释的那样,每页仍然会出现方面计数,但没问题我可以忍受它,因为其他事情按预期工作正常。但是仍然存在一些我想解决的问题:(1)没有可搜索的表达式,它给我每个文件的搜索结果,这是预期的,但是我想用于分页的 search:response 的总属性仍然给我总页数而不是总文件数。有什么解决方法吗?伙计们正在等待您的回复。
  • @user1660340 不太确定我理解你的意思,总属性给出总页数。也许对此提出一个新问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多