我正在使用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将任何属性节点内容视为与元素文本节点完全相同。
谢谢!
答案 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!