首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MarkLogic:在指定元素以外的任何元素中搜索单词

MarkLogic:在指定元素以外的任何元素中搜索单词
EN

Stack Overflow用户
提问于 2014-07-15 23:07:17
回答 3查看 250关注 0票数 0

我如何编写一个cts:查询来高效地搜索包含某个单词的文档,除非该单词只出现在某个元素中。

例如,我想返回包含单词“dog”的文档,但前提是它位于<title>之外的任何元素中。

因此,考虑到这些文档:

代码语言:javascript
复制
<document id="doc-1">
 <heading>foo</heading>
 <paragraph>foo foo foo</paragraph>
</document>

<document id="doc-2">
 <heading>bar dog</heading>
 <paragraph>bar bar bar</paragraph>
</document>

<document id="doc-3">
 <heading>foo dog</heading>
 <paragraph>dog bar bar</paragraph>
</document>

我要交还3号文件。

这是可行的:

代码语言:javascript
复制
for $i in $doc-set
         where( doc($i)//*/text()[contains(normalize-space(lower-case(.)), "dog")] 
             [not(parent::title)] )

return $i ;

但是它非常慢

EN

回答 3

Stack Overflow用户

发布于 2014-07-16 00:05:34

如果您总是想要排除title元素,那么在Admin UI上,转到数据库配置页面,单击Word Query (左侧),单击Excludes选项卡,然后添加该元素。然后,该元素将从索引中排除,cts:word-query()将在那里找不到术语。

要获得更灵活的解决方案,可以使用cts:not-in-query()函数,也就是“温和的不”。

代码语言:javascript
复制
cts:search(
  fn:doc(),
  cts:not-in-query(
    cts:word-query("dog"),
    cts:element-word-query(xs:QName("title"), "dog")
  )
)

请注意(如cts:not-in-query()页面中所述),您需要打开正确的位置索引。我认为对于这个示例,您需要打开元素单词位置,但要运行一些测试。

票数 3
EN

Stack Overflow用户

发布于 2014-07-15 23:10:10

使用cts:search

代码语言:javascript
复制
cts:search(//document, 
  cts:element-query((xs:QName('heading'), xs:QName('paragraph')),
    cts:word-query('dog', 'case-insensitive')))

或者,您可以创建字段索引并使用XPath表达式来定义要搜索的内容。

票数 1
EN

Stack Overflow用户

发布于 2015-03-04 19:00:48

使用cts:搜索说'Parent‘是你的根元素

cts:search(fn:doc()/Parentname()!='Title',cts:word-query("dog"))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24761730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档