gpt4 book ai didi

marklogic - 在 Marklogic 自定义约束中使用关系运算符进行搜索

转载 作者:行者123 更新时间:2023-12-02 01:42:44 28 4
gpt4 key购买 nike

有没有办法使用关系运算符来使用 MarkLogic 自定义约束进行搜索?

对于正常范围查询,我可以搜索完全匹配(“thing:123”)或使用关系运算符(“thing LT 123”)。但是,当我编写自定义约束时,只有完全匹配才有效。如果我使用关系运算符,它永远不会进入“解析”方法。

一个非常简单的示例,如果以任何方式触发约束,则不会返回任何内容:

xquery 库模块(它使用指定的“多格式”签名 here ,但其他模块执行相同的操作):

xquery version "1.0-ml";
module namespace test = "http://test/search";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

declare function test:parse(
$query as item(),
$right-or-option as element())
as schema-element(cts:query) {
<cts:false-query/> (: don't return anything :)
};

可以在 qconsole 中运行的 XQuery:

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

declare variable $OPTIONS := <options xmlns="http://marklogic.com/appservices/search">
<debug>true</debug>
<constraint name="test">
<custom facet="false">
<parse apply="parse" ns="http://test/search" at="/ext/search/test-search.xqy"/>
</custom>
</constraint>
</options>;

search:search("test GT foo",$OPTIONS)

搜索“test:foo”会使用cts:false-query()创建正确的查询。搜索“test GT foo”会返回所有文档。

使用关系运算符时的响应包含以下内容:

<search:qtext>test GT foo</search:qtext>
<search:report id="SEARCH-FLWOR">(cts:search(fn:collection(), cts:and-query((), ()), ("score-logtfidf",cts:score-order("descending")), 1))[1 to 10]</search:report>
<search:warning id="SEARCH-IGNOREDQTEXT">[test GT foo]</search:warning>

它似乎将其识别为不仅仅是纯文本搜索,但它不会将其发送到我的解析函数中。我怎样才能让它调用我的函数?

如果重要的话,真正的约束是使用三重范围查询,它确实支持运算符(假设我可以将它们放入其中)。如果有更好的方法通过 search:search 进行三重查询可以解决我当前的问题,但我想知道如何使自定义约束识别关系运算符。

最佳答案

简短版本:自定义约束不支持不等式运算符(LT、GT 等),但有一些方法可以解决这个问题。

更长的版本:

我认为这可行,所以我做了一些测试(郑重声明,我使用的是 MarkLogic 8.0-5.8)。我相信您的搜索选项与默认选项混合在一起(否则“test:foo”大小写将不起作用)。这些选项包括:

<search:grammar>
<search:joiner strength="50" apply="constraint" compare="LT" tokenize="word">LT</search:joiner>
</search:grammar>

这表示,当您看到两个由“LT”分隔的标记时,apply the constraint function弄清楚如何处理它们。这促使我查找该 constraint 函数的作用。经过几个级别的挖掘后,我在搜索 API 库中发现了这些代码行:

else if ($compare and (empty($matched-constraint/opt:range) or $is-bucketed)) 
then <search:annotation warning="SEARCH-IGNOREDQTEXT:[{concat($matched-constraint/@name/string()," ",$compare," ",$qtext-rhs)}]"/>

我确信您认识该注释。在我的测试中,$compare 是“LT”,$matched-constraint 是我的测试约束。此行要求 the constraint be a range type以便解析器将 LT 应用于此。

解决方法

我看到两个选择。

  1. 实现您可以在 Search API 语法 (apply="my-constraint") 的 joiner 部分中指定的不同函数,并使其适用于自定义约束。
  2. 实现解析函数的多个版本并设置多个约束:约束 test-lt 将应用 parse-lt 等。

注意:您可能会想深入了解搜索 API 的实现,并修改它以适合您的情况(毕竟,它只是一个 XQuery 库)。不。如果这样做,一旦升级 MarkLogic,您的更改就会消失,并且如果升级包括对该库的任何更改,您就会给自己带来麻烦。

如果您与 MarkLogic 的某人有关系,您可以要求该人提交 RFE,以允许这些加入者使用自定义约束。如果您不这样做,请告诉我。

关于marklogic - 在 Marklogic 自定义约束中使用关系运算符进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40982987/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com