代码之家  ›  专栏  ›  技术社区  ›  Ravi

带约束的Marklogic搜索语法语法

  •  0
  • Ravi  · 技术社区  · 6 年前

    <options xmlns="http://marklogic.com/appservices/search">
        <additional-query>
            <cts:and-query xmlns:cts="http://marklogic.com/cts">
                <cts:collection-query>
                    <cts:uri>OncoWatch</cts:uri>
                </cts:collection-query>
            </cts:and-query>
        </additional-query>
        <constraint name="search-text">
            <word>
                <field name="wos_topic"/>
            </word>
        </constraint>
        <term>
            <term-option>case-insensitive</term-option>
            <term-option>punctuation-insensitive</term-option>
            <term-option>whitespace-insensitive</term-option>
            <term-option>wildcarded</term-option>
        </term>
    </options>
    

    当我搜索字符串时 '(search-text:(patient* OR adult*))' 我得到的结果和我做这个时完全不同 '(search-text:patient*) OR (search-text:adult*)'

    1 回复  |  直到 5 年前
        1
  •  2
  •   grtjn    6 年前

    如果你申请的话,你很容易看出差别 search:parse

    xquery version "1.0-ml";
    
    import module namespace search = "http://marklogic.com/appservices/search"
         at "/MarkLogic/appservices/search/search.xqy";
    
    let $options := <options xmlns="http://marklogic.com/appservices/search">
        <additional-query>
            <cts:and-query xmlns:cts="http://marklogic.com/cts">
                <cts:collection-query>
                    <cts:uri>OncoWatch</cts:uri>
                </cts:collection-query>
            </cts:and-query>
        </additional-query>
        <constraint name="search-text">
            <word>
                <field name="wos_topic"/>
            </word>
        </constraint>
        <term>
            <term-option>case-insensitive</term-option>
            <term-option>punctuation-insensitive</term-option>
            <term-option>whitespace-insensitive</term-option>
            <term-option>wildcarded</term-option>
        </term>
    </options>
    return (
      search:parse("(search-text:(patient* OR adult*))", $options),
      search:parse("(search-text:patient*) OR (search-text:adult*)", $options)
    )
    

    搜索解析器支持相当复杂的带有AND、OR、NEAR等的搜索字符串,但是缺少将多个值输入到单个约束中的支持。后者是正确的写作方式。第一个简单地让解析器从它的外观上变得混乱,结果OR丢失了,有效地导致它搜索短语 search-text:"patient* adult*" 这和要求两个条件是一样的。

    啊!