首页 > 解决方案 > 通配符搜索不适用于路径索引

问题描述

这是给出所需结果的查询:

import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

search:search("( ( collectionId: ( "54930050DETB6CP71D38" ) )  )  sort:documentCreationDateDES", 
<options xmlns="http://marklogic.com/appservices/search">

    <term>
        <empty apply="all-results"/>
        <term-option>unstemmed</term-option>
        <term-option>case-insensitive</term-option>
        <term-option>punctuation-insensitive</term-option>
        <term-option>wildcarded</term-option>
    </term>

    <additional-query>{cts:directory-query('/dir/subdir01/', "1")}</additional-query>

    <transform-results apply="transformed-result" ns="http://searchgui/search" at="/customResultSet.xqy"/>

    (:
    Constraints or Search Criteria.
    - collectionId
    - creationDate
    :)

    <search:constraint name="collectionId">
        <search:range type="xs:string" facet="false" collation="http://marklogic.com/collation/en">
            <search:path-index ns="http://any.anyns.com/2013/doc">
                //cd:documentCollections/cd:collection/cd:id
            </search:path-index>
        </search:range>
    </search:constraint>

    <search:constraint name="creationDateRange">
        <search:range type="xs:dateTime" facet="false">
            <search:bucket ge="0" lt="0" name="documentCreationDate">
                Search by Document Creation date / uploaded date
            </search:bucket>
            <search:element ns="http://any.anyns.com/2013/doc" name="documentCreationDate"/>
            <facet-option>limit=10</facet-option>
            <facet-option>item-order</facet-option>
            <facet-option>descending</facet-option>
        </search:range>
    </search:constraint>

    (:
    Sorting options:
    - collectionId
    - creationDate
    :)
    <search:operator name="sort">

        (: Document Collection Id :)
        <search:state name="collectionIdASC">
            <search:sort-order direction="ascending" type="xs:string">
                <search:path-index ns="http://any.anyns.com/2013/doc">
                    //cd:documentCollections/cd:collection/cd:id
                </search:path-index>
            </search:sort-order>
        </search:state>
        <search:state name="collectionIdDES">
            <search:sort-order direction="descending" type="xs:string">
                <search:path-index ns="http://any.anyns.com/2013/doc">
                    //cd:documentCollections/cd:collection/cd:id
                </search:path-index>
            </search:sort-order>
        </search:state>

        (: Creation Date :)
        <search:state name="documentCreationDateASC">
            <search:sort-order direction="ascending" type="xs:dateTime">
                <search:element ns="http://any.anyns.com/2013/doc" name="documentCreationDate"/>
            </search:sort-order>
        </search:state>
        <search:state name="documentCreationDateDES">
            <search:sort-order direction="descending" type="xs:dateTime">
                <search:element ns="http://any.anyns.com/2013/doc" name="documentCreationDate"/>
            </search:sort-order>
        </search:state>

    </search:operator>
</options>, 1, 100);

但是当我用如下通配符替换搜索条件时,它不会返回任何结果:

"( ( collectionId: ( &quot;* *54930050DETB6CP71D38* *&quot; ) )  )  sort:documentCreationDateDES"

虽然我将它设置<term-option>wildcarded仍然不起作用,但任何关于我可能缺少的建议或指针都会有所帮助

我尝试过以不同的组合来回改变其他的term-option,但它不起作用,也不起作用或起作用。sensitiveinsensitivestemmedunstemmed

标签: wildcardmarklogicmarklogic-8marklogic-9

解决方案


Term-options 不适用于范围约束,只有 facet-options 可以。并且一个方面选项wildcarded不存在。范围约束非常适合选择范围,例如num GT x AND num LT y,但不适合中间字符串匹配。

我认为您必须为同一路径创建一个单词或值约束才能在其上使用通配符。不幸的是,您不能像您在 collectionId 约束中那样在特定路径上创建单词或值约束。您必须使用该路径创建一个字段。


推荐阅读