MarkLogic文本搜索:根据属性内的匹配返回结果

时间:2017-08-02 22:46:25

标签: search xquery marklogic

我正在使用Marklogic的search:search()函数来处理我的应用程序中的搜索,并且我有一个用例,用户需要能够执行文本搜索,从文档中的属性返回匹配项。

例如,使用此文档:

<document attr="foo attribute value">Some child content</document>

我希望用户能够为“foo”执行文本搜索(不使用约束),并根据属性@attr中的匹配返回我的文档。有没有办法配置查询选项以允许这个?

键入attr:“foo”不是一个可行的解决方案,因此使用属性范围约束无济于事,用户仍然需要能够搜索不在属性节点中的其他子内容。我想也许有一种方法可以添加一个cts:通过选项查询OR进入搜索,允许搜索这个属性?

对任何和所有其他解决方案开放。

谢谢!

修改

一些其他信息,以帮助澄清:

我需要能够在内容中的其他位置找到属性中的匹配项。使用上面的示例,搜索“foo”,“child content”或“foo child content”都应该返回我的文档作为结果。这意味着任何与搜索进行AND运算的查询选项(例如<additional-query>,用于帮助约束您的搜索而不是展开搜索)将​​无效。我正在寻找的是(可能)一个额外的查询选项,它将与原始搜索进行“或”操作,以便允许按子节点内容,属性内容或两者的混合进行搜索。

换句话说,就搜索而言,我希望MarkLogic将任何属性节点内容视为与元素文本节点完全相同。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以在搜索API的其他查询选项中使用序列化的element-attribute-word cts查询完成此搜索。元素属性词查询将使用通用索引来匹配属性中的各个标记。

在MarkLogic 9中您可以使用以下命令执行搜索:

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

search:search("",
  <options xmlns="http://marklogic.com/appservices/search">
    <additional-query>
      <cts:element-attribute-word-query xmlns:cts="http://marklogic.com/cts">
        <cts:element>document</cts:element>
        <cts:attribute>attr</cts:attribute>
        <cts:text>foo</cts:text>
      </cts:element-attribute-word-query>
    </additional-query>
  </options>
  )

答案 1 :(得分:0)

MarkLogic可以解析查询文本并将值映射到属性字或值查询。

首先,您可以使用cts:parse():

其次,您可以使用search:search()和XML有效内容中定义的约束:

答案 2 :(得分:0)

我希望使用<default>的{​​{1}}选项。有关详细信息,请参阅http://docs.marklogic.com/guide/search-dev/appendixa#id_31590

或者,考虑进行查询扩展。其背后的想法是最终用户发送搜索字符串。您使用search解析它:解析cts:parse(由Erik建议),而不是按原样向MarkLogic提交该查询,而是处理cts:query树,查找要调整或扩展的术语。通常用于自动混合同义词,相关术语或翻译,但可用于复制单个术语,并自动为这些术语添加查询。

HTH!