Как избежать одиночной кавычки в поиске: поиск?

Я использую search:search API.

в search options grammarЯ использовал цитату как "'"

<quotation>'</quotation>

Теперь, если строка поиска содержит одну кавычку, это создаст неправильную cts:query,

например: "pubTitle:''test pub''"

За pubTitle Я определил ограничение element-word-query,

Но из-за одинарной цитаты 'формируется cts-word запросы

Обновить:

У меня есть XML-файл, как указано ниже

<root>
  <pubTitle>'test''pu'b'</pubTitle>
  <firstPage>12</firstPage>
  <lastPage>45</lastPage>
</root>

Ограничение определено:

<constraint name="pubTitle">
    <value>
       <element ns="" name="pubTitle"/>
    </value>
</constraint>

Теперь я хочу найти документ с текстом 'test''pu'b' в элементе pubTitle.

Каким будет мой поисковый запрос? (search:search первый параметр)

Помогите!

1 ответ

Решение

Обновление помогло прояснить ситуацию. У вас есть контент с одинарными кавычками.

Точнее, вы хотите искать по названию, содержащему одинарные кавычки, пробелы и, возможно, даже взаимосвязь. Выполнение поиска по значению имеет смысл, но строка поиска, которую вы передаете в search:search разбирается Если вы не заключите поисковые значения или фразы в кавычки, синтаксический анализатор будет считать, что значение заканчивается на следующем пробеле. Если бы вы не изменили <quotation> вариант, парсер остановился бы после ''test (в первоначальном примере вы дали).

изменения <quotation> одиночные кавычки усугубили ситуацию, потому что в вашем поисковом значении также есть одинарные кавычки, и парсер их перепутает. Я не удивлюсь, если search:search закончил поиск test а также pub в полнотекстовом, что является поведением по умолчанию.

Двойная кавычка тоже немного хитрая, если вы хотите вызвать search:search вручную. Вам нужны двойные кавычки, чтобы обернуть искомое значение, а также определить всю строку поиска. Вы можете избежать внутренних двойных кавычек, удвоив их, записав их как &quot; сущность, но вы также можете использовать временный фрагмент XML. Что-то вроде этого:

xquery version "1.0-ml";

xdmp:document-insert("/test.xml", <root>
  <pubTitle>'test'' pu'b'</pubTitle>
  <firstPage>12</firstPage>
  <lastPage>45</lastPage>
</root>)

;

xquery version "1.0-ml";

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

let $searchText := <txt>'test'' pu'b'</txt>/concat('"', ., '"')
return
  search:search(
    "pubTitle:" || $searchText,
    <options xmlns="http://marklogic.com/appservices/search">
      <constraint name="pubTitle">
        <value>
          <element ns="" name="pubTitle"/>
        </value>
      </constraint>
    </options>
  )

Я надеюсь, что это поможет вам!

Другие вопросы по тегам