首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将查询限制为使用Search的元素进行搜索:搜索

将查询限制为使用Search的元素进行搜索:搜索
EN

Stack Overflow用户
提问于 2019-05-31 14:10:36
回答 1查看 49关注 0票数 0

在下面的链接中,我想要做的类似的事情,但我们希望它使用search:search

基本上,我们有2个xml,如下所示:

XML-1

代码语言:javascript
复制
<rootElement>
   <id>7635940284725382300</id>
   <parentElement>
      <childElement1>ce1-A</childElement1>
      <childElement2>ce2-1</childElement2>
   </parentElement>
   <parentElement>
      <childElement1>ce1-B</childElement1>
      <childElement2>ce2-2</childElement2>
      </parentElement>
   <parentElement>
      <childElement1>ce1-C</childElement1>
      <childElement2>ce2-3</childElement2>
   </parentElement>
</rootElement>

XML-2

代码语言:javascript
复制
<rootElement>
   <id>7635940284725382398</id>
   <parentElement>
      <childElement1>ce1-A</childElement1>
      <childElement2>ce2-2</childElement2>
   </parentElement>
   <parentElement>
      <childElement1>ce1-B</childElement1>
      <childElement2>ce2-3</childElement2>
      </parentElement>
   <parentElement>
      <childElement1>ce1-C</childElement1>
      <childElement2>ce2-4</childElement2>
   </parentElement>
</rootElement>

所以现在我要做的是在同一个childElement1childElement2中匹配一个parentElement

例如:

如果我使用值childElement1 = ce1-BchildElement2 = ce2-3进行搜索,它只应该给出XML-2,而不是返回XML-1

我们使用cts:search查询实现了这一点,如链接中所解释的那样:

代码语言:javascript
复制
cts:search (/, 
     cts:element-query (
         xs:QName ('parentElement'),
         cts:and-query ((
             cts:element-value-query(xs:QName('childElement1'), 'ce1-B', 'exact'),
             cts:element-value-query(xs:QName('childElement2'), 'ce2-3', 'exact')
         ))
     )
)

问题:

我们使用的search:search与不同的search:constraint?我读过关于使用container来实现这个功能的文章,但是没有很好的例子来说明如何使用它。

下面是我们的示例search:search,因此需要对其进行调整,使其具有与上面所示的cts:search查询相同的功能:

代码语言:javascript
复制
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

search:search("childElement1:ce1-B AND childElement2:ce2-3 sort:childElement2ASC"
    , <options xmlns="http://marklogic.com/appservices/search">
        <term>
            <term-option xmlns="http://marklogic.com/appservices/search">unstemmed</term-option>
            <empty apply="all-results" />
            <term-option>case-insensitive</term-option>
            <term-option>wildcarded</term-option>
        </term>

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

        <search:constraint name="childElement1">
            <search:range type="xs:string" facet="false" collation="http://marklogic.com/collation/en">
                <search:path-index ns="http://my.search.com/something">//childElement1</search:path-index>
            </search:range>
        </search:constraint>

        <search:constraint name="childElement2">
            <search:range type="xs:string" facet="false" collation="http://marklogic.com/collation/en">
                <search:path-index ns="http://my.search.com/something">//childElement2</search:path-index>
            </search:range>
        </search:constraint>

        <search:operator name="sort">
            <search:state name="childElement1ASC">
                <search:sort-order direction="ascending" type="xs:string">
                <search:path-index ns="http://my.search.com/something">//childElement1</search:path-index>
                </search:sort-order>
            </search:state>
            <search:state name="childElement1DES">
                <search:sort-order direction="descending" type="xs:string">
                <search:path-index ns="http://my.search.com/something">//childElement1</search:path-index>
                </search:sort-order>
            </search:state>
            <search:state name="childElement2ASC">
                <search:sort-order direction="ascending" type="xs:string">
                <search:path-index ns="http://my.search.com/something">//childElement2</search:path-index>
                </search:sort-order>
            </search:state>
            <search:state name="childElement2DES">
                <search:sort-order direction="descending" type="xs:string">
                <search:path-index ns="http://my.search.com/something">//childElement2</search:path-index>
                </search:sort-order>
            </search:state>
        </search:operator>
    </options>
    , 0
    , 15);

希望这有助于回答。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-31 15:11:30

你走在正确的轨道上。使用container选项,它与任何其他约束选项一样工作,然后将嵌套的查询封装在括号中。

例如:

代码语言:javascript
复制
search:parse('contain:(test one two)',
  <options xmlns="http://marklogic.com/appservices/search">
    <constraint name="contain">
      <container>
        <element ns="" name="parentElement"/>
      </container>
    </constraint>    
  </options>)

=>

代码语言:javascript
复制
  <cts:element-query xmlns:cts="http://marklogic.com/cts">
    <cts:element>parentElement</cts:element>
    <cts:and-query>
      <cts:word-query>
        <cts:text xml:lang="en">test</cts:text>
      </cts:word-query>
      <cts:word-query>
        <cts:text xml:lang="en">one</cts:text>
      </cts:word-query>
      <cts:word-query>
        <cts:text xml:lang="en">two</cts:text>
      </cts:word-query>
    </cts:and-query>
  </cts:element-query>

因此,在您的示例中,主搜索字符串为:

代码语言:javascript
复制
search:search('contain:(childElement1:ce1-B AND childElement2:ce2-3) sort:childElement2ASC', <options ....)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56396692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档