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

Я использую 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 первый параметр)

Помощь!


person Dixit Singla    schedule 09.03.2017    source источник
comment
В вашем примере читается pubTitle:''test pub'' (вы используете двойные одинарные кавычки для заключения поисковой фразы, но вместо этого я думаю, что это должно быть pubTitle:'test pub'. Опечатка или намеренно?   -  person grtjn    schedule 10.03.2017
comment
Он с двойными кавычками ( pubTitle: ''test pub''). Я передаю его как первый параметр поиска: поиск, также отредактировал вопрос   -  person Dixit Singla    schedule 10.03.2017
comment
Я говорил о цитатах вокруг test pub..   -  person grtjn    schedule 10.03.2017
comment
Да, есть две двойные одинарные кавычки... Если есть только одна одинарная кавычка, то поисковый API без проблем сформирует запрос cts, как и ожидалось...   -  person Dixit Singla    schedule 10.03.2017
comment
@grtjn Если вы понимаете проблему, пожалуйста, помогите.   -  person Dixit Singla    schedule 16.03.2017
comment
К сожалению, ваше описание и комментарии мне не очень понятны. Убедитесь, что вы используете кавычки осторожно. Я не вижу необходимости удваивать одинарные кавычки. Кроме того, непонятно, почему вы использовали одинарную кавычку для цитаты в параметрах поиска. Почему бы не использовать двойные кавычки по умолчанию для цитирования?   -  person grtjn    schedule 16.03.2017
comment
@grtjn Я обновил свой вопрос. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.   -  person Dixit Singla    schedule 16.03.2017
comment
Это объясняет одинарные кавычки, теперь я полностью понимаю вашу проблему.   -  person grtjn    schedule 16.03.2017


Ответы (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>
  )

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

person grtjn    schedule 16.03.2017