我如何编写一个cts:查询来高效地搜索包含某个单词的文档,除非该单词只出现在某个元素中。
例如,我想返回包含单词“dog”的文档,但前提是它位于<title>之外的任何元素中。
因此,考虑到这些文档:
<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号文件。
这是可行的:
for $i in $doc-set
where( doc($i)//*/text()[contains(normalize-space(lower-case(.)), "dog")]
[not(parent::title)] )
return $i ;但是它非常慢
发布于 2014-07-16 00:05:34
如果您总是想要排除title元素,那么在Admin UI上,转到数据库配置页面,单击Word Query (左侧),单击Excludes选项卡,然后添加该元素。然后,该元素将从索引中排除,cts:word-query()将在那里找不到术语。
要获得更灵活的解决方案,可以使用cts:not-in-query()函数,也就是“温和的不”。
cts:search(
fn:doc(),
cts:not-in-query(
cts:word-query("dog"),
cts:element-word-query(xs:QName("title"), "dog")
)
)请注意(如cts:not-in-query()页面中所述),您需要打开正确的位置索引。我认为对于这个示例,您需要打开元素单词位置,但要运行一些测试。
发布于 2014-07-15 23:10:10
使用cts:search
cts:search(//document,
cts:element-query((xs:QName('heading'), xs:QName('paragraph')),
cts:word-query('dog', 'case-insensitive')))或者,您可以创建字段索引并使用XPath表达式来定义要搜索的内容。
发布于 2015-03-04 19:00:48
使用cts:搜索说'Parent‘是你的根元素
cts:search(fn:doc()/Parentname()!='Title',cts:word-query("dog"))
https://stackoverflow.com/questions/24761730
复制相似问题