Поиск с запросами, привязанными к элементам, используя search: search - PullRequest
0 голосов
/ 31 мая 2019

То, что я хочу сделать, похоже на следующую ссылку, но мы хотим, чтобы оно использовало search:search:

В основном у нас есть 2 xmls, такие как:

XML-1

<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

<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>

Итак, теперь я хочу получитьсовпадение для childElement1 и childElement2 в пределах одного и того же parentElement.

Например:

Если я ищу по значениям childElement1 = ce1-B и childElement2 = ce2-3, это должно дать мне толькоXML-2 и не вернуть XML-1.

Мы достигли этого с помощью запроса cts:search, как объяснено в ссылке:

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, показанном выше:

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);

Надеюсь, это поможет ответить.

1 Ответ

2 голосов
/ 31 мая 2019

Вы на правильном пути. Используйте параметр container, который работает как любой другой параметр ограничения, затем заключите вложенный запрос в скобки.

Например:

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

=>

  <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>

Так что в вашем случае вы бы имели строку основного поиска как:

search:search('contain:(childElement1:ce1-B AND childElement2:ce2-3) sort:childElement2ASC', <options ....)
...