当传递任何特殊字符(@,=,#,$,%,^,*)时,字段值查询会产生意外结果。
请找到我插入ML的4个示例文档。
<root>
<journalTitle>Dinesh</journalTitle>
<sourceType>JA</sourceType>
<title>title1</title>
<volume>volume0</volume>
</root>
<root>
<journalTitle>Gayari</journalTitle>
<sourceType>JA</sourceType>
<title>title1</title>
<volume>volume0</volume>
</root>
<root>
<journalTitle>Dixit</journalTitle>
<sourceType>JA</sourceType>
<title>title1</title>
<volume>volume0</volume>
</root>
<root>
<journalTitle>Singla</journalTitle>
<sourceType>JA</sourceType>
<title>title1</title>
<volume>volume0</volume>
</root>
CTS查询:
cts:search(
fn:doc(),
cts:field-value-query("Sample","#@#@#@*()", ("unwildcarded")),
"unfiltered"
)
在运行此查询时,我将获取所有文档。
根据我的理解,它应该返回空序列。
请在下面找到我创建的字段。
字段(XML格式):
<field xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://marklogic.com/xdmp/database">
<field-name>Sample</field-name>
<field-path>
<path>/root/journalTitle</path>
<weight>1.0</weight>
</field-path>
<word-lexicons/>
<included-elements/>
<excluded-elements/>
<tokenizer-overrides/>
</field>
索引设置:
如果我在搜索字符串中添加任何字母,它会给我正确的结果。
像:
请帮我解决这个问题?
答案 0 :(得分:2)
尝试传递&#34;确切&#34;作为cts:field-value-query
的选项:
cts:search(
fn:doc(),
cts:field-value-query("Sample","#@#@#@*()", ("exact")),
"unfiltered"
)
MarkLogic有一个精确值的索引可以帮助处理这种情况。请注意,只有当您启用了区分大小写和变音符敏感索引时(您可以这样做)。我知道这适用于cts:element-value-query
,所以我希望它也适用于cts:field-value-query
。
答案 1 :(得分:2)
在field-value-query中使用'exact'选项。
这需要快速变音符号和区分大小写的选项,但您已经启用了这些选项。
您也可以在使用'exact'之前和之后尝试xdmp:plan,以查看对查询计划的影响。
答案 2 :(得分:1)
在您的字段的'tokenizer覆盖'选项中,将这些特殊字符(@,=,#,$,%,^,*)添加为单词(选择'word')。
默认情况下,不考虑这些特殊字符进行匹配。您需要覆盖默认的标记生成器以将它们包含为单词。
答案 3 :(得分:0)
我可以知道你希望传递这个cts的输出是什么:element-word-query(xs:QName(&#34; journalTitle&#34;),&#34; ===== S&#34;)对于上面给出的xmls。
答案 4 :(得分:0)
在数据库配置中将一个字符搜索更改为true,解决了元素字查询中的问题。