Поиск по шаблону с «*» и «?» в поиске: поиск не работает должным образом

#marklogic

#marklogic

Вопрос:

Нам нужно выполнить поиск по шаблону с обоими символами «*» и «?», как описано в

https://docs.marklogic.com/10.0/guide/search-dev/wildcard

Символы подстановки Сервер Marklogic поддерживает два символа подстановки: * и ?.

  • соответствует нулю или более символов, не содержащих пробелов. ? соответствует ровно одному символу без пробела. Например, he * будет соответствовать любому слову, начинающемуся с he, например, he, her, help, hello, helicopter и так далее. С другой стороны, он? будут совпадать только слова из трех букв, начинающиеся с he, такие как hem, hen и так далее.

Но мы выполняем поиск, как показано ниже,

 let $options := <options xmlns="http://marklogic.com/appservices/search">   
                  <constraint name="DocumentTitle">
                    <word type="xs:string" facet="false">
                      <element ns="http://marklogic.com/nondeliverable" name="DocumentTitle"/>
                      <search:term-option>wildcarded</search:term-option>, 
                       <search:term-option>case-insensitive</search:term-option>,
                       <search:term-option>diacritic-insensitive</search:term-option>,
                       <search:term-option>unstemmed</search:term-option>
                    </word>
                  </constraint>
                  <return-query>true</return-query>
                  <return-qtext>true</return-qtext>
                  <return-metrics>true</return-metrics>
                </options>
                
return (search:search("(DocumentTitle:(medi*ation))",$options,1,10),search:search("(DocumentTitle:(medi?ation))",$options,1,10))
 

Оба поисковых запроса возвращают одинаковое количество. Но если мы выполним поиск

 cts:search(fn:doc(),cts:element-word-query(xs:QName("nd:DocumentTitle"),"medi?ation",("wildcarded"))),cts:search(fn:doc(),cts:element-word-query(xs:QName("nd:DocumentTitle"),"medi*ation",("wildcarded"))) 
 

количество отличается и возвращает правильный результат.

Как мы можем добиться поиска по шаблону с обоими символами «*» и «?» в поиске: поиск с правильным результатом.

Ответ №1:

cts:search по умолчанию выполняется с фильтрацией, а по умолчанию search:search выполняется без фильтрации. Передайте в filtered качестве опции в cts:search , и посмотрите, возвращает ли это те же результаты, search:search что и .

Кроме того, вы также можете предоставить опцию поиска, чтобы сделать поиск: поиск фильтрованным:

 <search-option>filtered</search-option>
 

Кстати, фильтрация выполняется медленно, и в идеале вы должны выбрать параметры индекса, которые делают фильтрацию ненужной. Проверьте, включены ли настройки подстановочных знаков.

HTH!