Marklogic 通配符cts:返回错误匹配项的元素值查询
Marklogic 通配符cts:返回错误匹配项的元素值查询,marklogic,Marklogic,通配符cts:element-value查询的行为不符合预期 插入单据查询: xdmp:document-insert('/sample/2.xml', <data>the living Theater</data>) 上面的cts查询正在返回/sample/2.xml文档。根据我的理解,此查询不应返回上述文档,而应仅返回以剧院文本开头的文档 似乎问题在于下面的文本模式 在文档中显示文本:@@@word@@@text 搜索词:@@@t** @-可以是任何字符 我也能用下
通配符
cts:element-value查询
的行为不符合预期
插入单据查询:
xdmp:document-insert('/sample/2.xml', <data>the living Theater</data>)
上面的cts查询正在返回/sample/2.xml
文档。根据我的理解,此查询不应返回上述文档,而应仅返回以剧院
文本开头的文档
似乎问题在于下面的文本模式
在文档中显示文本:@@@word@@@text
搜索词:@@@t**
@-可以是任何字符
我也能用下面的数据重现这个问题
在文档中显示文本:标记标记逻辑
搜索文本:markl**
与通配符相关的索引设置为true
我已经粘贴了数据库配置,这可能有助于发现问题
数据库配置:
<package-database xmlns="http://marklogic.com/manage/package/databases">
<config>
<name>publishers</name>
<package-database-properties>
<enabled>true</enabled>
<retired-forest-count>0</retired-forest-count>
<language>en</language>
<stemmed-searches>advanced</stemmed-searches>
<word-searches>true</word-searches>
<word-positions>true</word-positions>
<fast-phrase-searches>true</fast-phrase-searches>
<fast-reverse-searches>false</fast-reverse-searches>
<triple-index>true</triple-index>
<triple-positions>true</triple-positions>
<fast-case-sensitive-searches>true</fast-case-sensitive-searches>
<fast-diacritic-sensitive-searches>true</fast-diacritic-sensitive-searches>
<fast-element-word-searches>true</fast-element-word-searches>
<element-word-positions>true</element-word-positions>
<fast-element-phrase-searches>true</fast-element-phrase-searches>
<element-value-positions>true</element-value-positions>
<attribute-value-positions>true</attribute-value-positions>
<field-value-searches>true</field-value-searches>
<field-value-positions>true</field-value-positions>
<three-character-searches>true</three-character-searches>
<three-character-word-positions>true</three-character-word-positions>
<fast-element-character-searches>true</fast-element-character-searches>
<trailing-wildcard-searches>true</trailing-wildcard-searches>
<trailing-wildcard-word-positions>true</trailing-wildcard-word-positions>
<fast-element-trailing-wildcard-searches>true</fast-element-trailing-wildcard-searches>
<word-lexicons>
<word-lexicon>http://marklogic.com/collation/codepoint</word-lexicon>
</word-lexicons>
<two-character-searches>false</two-character-searches>
<one-character-searches>false</one-character-searches>
<uri-lexicon>true</uri-lexicon>
<collection-lexicon>true</collection-lexicon>
<reindexer-enable>true</reindexer-enable>
<reindexer-throttle>5</reindexer-throttle>
<reindexer-timestamp>0</reindexer-timestamp>
<directory-creation>manual</directory-creation>
<maintain-last-modified>false</maintain-last-modified>
<maintain-directory-last-modified>false</maintain-directory-last-modified>
<inherit-permissions>false</inherit-permissions>
<inherit-collections>false</inherit-collections>
<inherit-quality>false</inherit-quality>
<in-memory-limit>174080</in-memory-limit>
<in-memory-list-size>341</in-memory-list-size>
<in-memory-tree-size>85</in-memory-tree-size>
<in-memory-range-index-size>11</in-memory-range-index-size>
<in-memory-reverse-index-size>11</in-memory-reverse-index-size>
<in-memory-triple-index-size>44</in-memory-triple-index-size>
<large-size-threshold>1024</large-size-threshold>
<locking>fast</locking>
<journaling>fast</journaling>
<journal-size>682</journal-size>
<journal-count>2</journal-count>
<preallocate-journals>false</preallocate-journals>
<preload-mapped-data>false</preload-mapped-data>
<preload-replica-mapped-data>false</preload-replica-mapped-data>
<range-index-optimize>facet-time</range-index-optimize>
<positions-list-max-size>256</positions-list-max-size>
<format-compatibility>automatic</format-compatibility>
<index-detection>automatic</index-detection>
<expunge-locks>none</expunge-locks>
<tf-normalization>scaled-log</tf-normalization>
<merge-priority>lower</merge-priority>
<merge-max-size>32768</merge-max-size>
<merge-min-size>1024</merge-min-size>
<merge-min-ratio>2</merge-min-ratio>
<merge-timestamp>0</merge-timestamp>
<retain-until-backup>false</retain-until-backup>
<assignment-policy-name>bucket</assignment-policy-name>
</package-database-properties>
</config>
</package-database>
出版者
真的
0
EN
先进的
真的
真的
真的
假的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
真的
http://marklogic.com/collation/codepoint
假的
假的
真的
真的
真的
5.
0
手册
假的
假的
假的
假的
假的
174080
341
85
11
11
44
1024
快速的
快速的
682
2.
假的
假的
假的
刻面时间
256
自动的
自动的
没有一个
比例原木
降低
32768
1024
2.
0
假的
水桶
尝试在数据元素上创建元素范围索引,然后运行以下搜索:
let $terms := cts:element-value-match(xs:QName("data"),"theater* *")
return
cts:search(
doc(),
cts:element-value-query(
xs:QName('data'),
$terms,
('wildcarded', 'case-insensitive', 'unstemmed', 'punctuation-sensitive', 'whitespace-sensitive')
),
'unfiltered'
)
这不会为您获取“/sample/2.xml”文档未经筛选的搜索附带以下内容:
- 它们直接从索引中确定结果,无需过滤验证。这使得未过滤的结果最为复杂
与传统搜索引擎风格的结果相当李>
- 包括假阳性结果。假阳性结果可能来自多种情况,包括短语搜索 包含3个或更多单词,某些通配符搜索, 区分标点、变音和/或大小写 搜索
cts:contains
进行此操作。此xquery显示您的结果确实是假阳性:
xquery version "1.0-ml";
declare boundary-space preserve;
declare namespace qm="http://marklogic.com/xdmp/query-meters";
let $trueCounter := 0
let $falseCounter := 0
let $query := cts:element-value-query(xs:QName('data'), 'theater* *')
let $x :=
for $result in cts:search(fn:doc(), $query, "unfiltered")
return
(
if ( cts:contains($result, $query) )
then ( xdmp:set($trueCounter, $trueCounter + 1) )
else ( xdmp:set($falseCounter, $falseCounter + 1) )
)
return
<results>
<resultTotal>{$trueCounter}</resultTotal>
<false-positiveTotal>{$falseCounter}</false-positiveTotal>
<elapsed-time>{xdmp:query-meters()/qm:elapsed-time/text()}
</elapsed-time>
</results>
xquery版本“1.0-ml”;
宣布边界空间保留;
声明命名空间qm=”http://marklogic.com/xdmp/query-meters";
让$trueCounter:=0
让$falseCounter:=0
let$query:=cts:element值查询(xs:QName('data'),'theater**')
let$x:=
对于cts:search中的$result(fn:doc(),$query,“未筛选”)
返回
(
if(cts:contains($result,$query))
然后(xdmp:set($trueCounter,$trueCounter+1))
其他(xdmp:set($falseCounter,$falseCounter+1))
)
返回
{$trueCounter}
{$falseCounter}
{xdmp:query-meters()/qm:appeased time/text()}
MarkLogic搜索分为两个步骤:
- 您的内容和搜索条件使您知道未过滤的搜索也是准确的(例如,搜索是全部) 在文档或片段根处执行,它们是单术语查询, 和是非通配符、标点符号敏感、变音符号敏感, 和/或区分大小写的搜索)
- 你不介意是否有一些假阳性结果,因为结果是一个估计(也就是说,它们需要很快,但是很快) 不要求精确)
- 您的搜索返回大量结果,您需要高效的方法跳转到这些结果的特定部分
希望这有帮助 使用
“筛选”选项执行搜索时,您是否得到正确的结果?@MadsHansen Yes。。使用filtered,我得到了正确的结果,但是我不能使用filtered选项,因为它太慢了。请尝试启用元素单词位置。您需要这样才能在不过滤的情况下准确解析多标记值。@grtjn元素字位置
设置为true。还是一样的问题。尝试使用http://marklogic.com/collation/codepoint
整理但没有收获。请帮助我,因为我经常面临这个问题,无法确定我做错了什么。看起来value
query的行为类似于word
query这是一个很好的工作
xquery version "1.0-ml";
declare boundary-space preserve;
declare namespace qm="http://marklogic.com/xdmp/query-meters";
let $trueCounter := 0
let $falseCounter := 0
let $query := cts:element-value-query(xs:QName('data'), 'theater* *')
let $x :=
for $result in cts:search(fn:doc(), $query, "unfiltered")
return
(
if ( cts:contains($result, $query) )
then ( xdmp:set($trueCounter, $trueCounter + 1) )
else ( xdmp:set($falseCounter, $falseCounter + 1) )
)
return
<results>
<resultTotal>{$trueCounter}</resultTotal>
<false-positiveTotal>{$falseCounter}</false-positiveTotal>
<elapsed-time>{xdmp:query-meters()/qm:elapsed-time/text()}
</elapsed-time>
</results>