1

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

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

索引设置:

索引设置

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

喜欢:

  • @#$​​%F
  • =====S
  • df===$d

请帮我解决这个问题?

4

5 回答 5

2

尝试将“精确”作为选项传递给cts:field-value-query

cts:search(
  fn:doc(),
  cts:field-value-query("Sample","#@#@#@*()", ("exact")),
  "unfiltered"
)

MarkLogic 有一个精确值的索引,可以在这种情况下提供帮助。请注意,仅当您同时启用区分大小写和变音符号的索引时才启用(您这样做)。我知道这适用,cts:element-value-query所以我希望它也适用cts:field-value-query

于 2017-03-06T15:33:10.847 回答
2

在 field-value-query 中使用 'exact' 选项。

这需要快速变音符号和区分大小写的选项,但您已经启用了这些选项。

您也可以在使用 'exact' 前后尝试 xdmp:plan 以查看对查询计划的影响。

于 2017-03-06T15:35:50.723 回答
1

在您的字段的“标记器覆盖”选项中,将这些特殊字符(@、=、#、$、%、^、*)添加为单词(选择“单词”)。

默认情况下不考虑匹配这些特殊字符。您需要覆盖默认标记器以将它们包含为单词。

于 2018-05-25T11:41:41.000 回答
0

我可以知道你在传递这个 cts:element-word-query(xs:QName("journalTitle"),"=====S") 对于上面给出的 xmls 时期望什么输出。

于 2017-03-15T18:49:20.590 回答
0

在数据库配置中将单字符搜索更改为真,解决了元素词查询中的问题。

于 2017-03-15T19:29:08.460 回答