具有特殊字符和未过滤搜索的字段值查询返回意外结果?

时间:2017-03-06 11:59:51

标签: indexing marklogic marklogic-7

当传递任何特殊字符(@,=,#,$,%,^,*)时,字段值查询会产生意外结果。

请找到我插入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>

索引设置:

Index setting

如果我在搜索字符串中添加任何字母,它会给我正确的结果。

像:

  • @#$%F
  • =====小号
  • DF === $ d

请帮我解决这个问题?

5 个答案:

答案 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,解决了元素字查询中的问题。