字段索引仅在合并后更新

问题描述 投票:0回答:1

我创建了一个简单的字段索引,如下所示:

我正在创建一个带有元素content和两个子元素headerbody的文档。第二个请求使用字段索引查找所有值并测试它是否包含单词Body。正如预期的那样。然后我在没有body元素的情况下更新我的文档并再次请求字段索引单词。字段索引仍包含单词Body。这是我的测试脚本:

xquery version "1.0-ml";

xdmp:document-insert("test.xml", 
  <test>
    <title>not found</title>
    <content>
      <header>Found</header>
      <body>Body</body>
    </content>
  </test>
);
fn:exists(fn:index-of(
  cts:field-words("root_test", (), ("collation=http://marklogic.com/collation/de/S1")), 
  "Body"
)) = fn:true();

xdmp:document-insert("test.xml", 
  <test>
    <title>not found</title>
    <content>
      <header>Found</header>
    </content>
  </test>
);
fn:empty(fn:index-of(
  cts:field-words("root_test", (), ("collation=http://marklogic.com/collation/de/S1")),
  "Body"
)) = fn:true()

我期待以下输出:

true
true

但我真正得到的是:

true
false

只有在更新(第二次插入)后执行手动合并时,才会从字段索引中删除单词Body

我在这里做错了吗?使用9.0-8

marklogic marklogic-9
1个回答
2
投票

单词lexicon不会跟踪特定的文档实例 - 这样做会非常昂贵 - 因此它无法在合并之后清除有关已删除单词的信息。为查询建议提供单词词典并协助某些通配符查询;您不应指望它们提供有关语料库中是否存在特定单词的准确信息。

如果想知道特定单词是否在语料库中,则对单词查询进行估计,例如, xdmp:estimate(cts:search(doc(),cts:word-query("Body",("unstemmed","case-insensitive","diacritic-insensitive"))))。但是,这不会给出与排序规则完全相同的等式约束,因为搜索是基于代码点的,并且不会折叠兼容性字符等。

© www.soinside.com 2019 - 2024. All rights reserved.