【问题标题】:Unexpected behavior shown by search:search in marklogic搜索显示的意外行为:在 marklogic 中搜索
【发布时间】:2026-01-14 11:40:01
【问题描述】:

我正在使用search:search 搜索以下类型的结构:

search:search(
  "",
  <options>
    <additional-query>
      {
        cts:and-query((
            cts:collection-query("A"),
            cts:not-query(cts:collection-query("B")),
            cts:not-query(cts:collection-query("C")),
            cts:and-query((
                cts:element-value-query(
                  xs:QName("uri"),
                  cts:search(collection("A"),
                    cts:element-value-query(xs:QName("uri"),
                      cts:search(collection("B"),
                        cts:element-value-query(xs:QName("uri"),
                          cts:search(collection("C"),cts:word-query("Hello"))/fn:base-uri()
                        )
                      )/fn:base-uri()
                    )
                  )/fn:base-uri()
                ),
                dls:documents-query()
            ))
        ))
      }
    </additional-query>
  </options>,1,10)

结果为 0。

但是,如果我尝试这样做,它会给出所需的结果

let $a :=
  cts:search(collection("A"),
    cts:element-value-query(xs:QName("uri"),
      cts:search(collection("B"),
        cts:element-value-query(xs:QName("uri"),
          cts:search(collection("C"),cts:word-query("Hello"))/fn:base-uri()
        )
      )/fn:base-uri()
    )
  )/fn:base-uri()
return
  search:search(
    "",
    <options>
      <additional-query>
        {
          cts:and-query((
              cts:collection-query("A"),
              cts:not-query(cts:collection-query("B")),
              cts:not-query(cts:collection-query("C")),
              cts:and-query((
                  cts:element-value-query(
                    xs:QName("uri"),
                    $a
                  ),
                  dls:documents-query()
              ))
          ))
        }
      </additional-query>
    </options>, 1, 10)

它解决了一些部分被取出然后传入search:search选项的问题。 请查看并提供帮助

【问题讨论】:

    标签: xml search full-text-search xquery marklogic


    【解决方案1】:

    您不能将cts:query 直接嵌入search:options

    请尝试:

    <search:options>
    <search:additional-query>{...your cts:query here ...}</search:additional-query>
    </search:options>
    

    有关详细信息,请参阅:

    http://docs.marklogic.com/guide/rest-dev/appendixb#id_98507

    此外,如果您想使用子查询来检索用作条件的值,您应该在作为值的来源和查询目标的元素上创建范围索引,并使用cts:values() 词典查找。有关详细信息,请参阅:

    http://docs.marklogic.com/cts:values

    希望对您有所帮助,

    【讨论】:

    • 我已经写了,上面忘记写了。
    • 感谢您的澄清。在查看它时,我发现子查询在 search:additional-query 中不起作用,因为它使用 cts:query() 反序列化附加查询。我认为 cts:query() 构造函数不会执行子查询。因此,单独执行子查询是正确的方法,尽管您可能会考虑在管理 UI 中启用 uris 词典并使用 cts:uris() 而不是 cts:search() 进行子查询。见:docs.marklogic.com/cts:uris
    • 您的查询还显示了许多跨文档的连接。考虑是否可以改为非规范化。
    • 谢谢戴夫,但事情是我不能,要求是记录上述查询,以便管理员可以使用上述查询并使用 xdmp:spawn 运行它