подстановочный знак cts: элемент-значение-запрос, возвращающий неправильные соответствия - PullRequest
0 голосов
/ 24 сентября 2018

wildcard cts:element-value-query не работает должным образом.

запрос на вставку документа:

xdmp:document-insert('/sample/2.xml', <data>the living Theater</data>)

запрос cts:

cts:search(
    doc(),
    cts:element-value-query(xs:QName('data'), 'theater* *', ('wildcarded', 'case-insensitive', 'unstemmed', 'punctuation-sensitive', 'whitespace-sensitive')),
    'unfiltered'
)

Запрос выше ctsвозвращаю мне документ /sample/2.xml.Насколько я понимаю, этот запрос не должен возвращать вышеуказанный документ, он должен возвращать только документы, начинающиеся с theater text.

похоже, проблема в следующем текстовом шаблоне.

present textв документе: @@@ word @@@text

условие поиска: @@@t* *

@ - может быть любым символом.

Я также могу воспроизвести проблему с приведенными ниже данными.

представить текст в документе: mark the marklogic

текст для поиска: markl* *

для индексов, связанных с подстановочными знаками, установлено значение true.

Я вставилконфигурация базы данных, это может помочь в обнаружении проблемы.

Конфигурация базы данных:

<package-database xmlns="http://marklogic.com/manage/package/databases">
    <config>
        <name>publishers</name>
        <package-database-properties>
            <enabled>true</enabled>
            <retired-forest-count>0</retired-forest-count>
            <language>en</language>
            <stemmed-searches>advanced</stemmed-searches>
            <word-searches>true</word-searches>
            <word-positions>true</word-positions>
            <fast-phrase-searches>true</fast-phrase-searches>
            <fast-reverse-searches>false</fast-reverse-searches>
            <triple-index>true</triple-index>
            <triple-positions>true</triple-positions>
            <fast-case-sensitive-searches>true</fast-case-sensitive-searches>
            <fast-diacritic-sensitive-searches>true</fast-diacritic-sensitive-searches>
            <fast-element-word-searches>true</fast-element-word-searches>
            <element-word-positions>true</element-word-positions>
            <fast-element-phrase-searches>true</fast-element-phrase-searches>
            <element-value-positions>true</element-value-positions>
            <attribute-value-positions>true</attribute-value-positions>
            <field-value-searches>true</field-value-searches>
            <field-value-positions>true</field-value-positions>
            <three-character-searches>true</three-character-searches>
            <three-character-word-positions>true</three-character-word-positions>
            <fast-element-character-searches>true</fast-element-character-searches>
            <trailing-wildcard-searches>true</trailing-wildcard-searches>
            <trailing-wildcard-word-positions>true</trailing-wildcard-word-positions>
            <fast-element-trailing-wildcard-searches>true</fast-element-trailing-wildcard-searches>
            <word-lexicons>
                <word-lexicon>http://marklogic.com/collation/codepoint</word-lexicon>
            </word-lexicons>
            <two-character-searches>false</two-character-searches>
            <one-character-searches>false</one-character-searches>
            <uri-lexicon>true</uri-lexicon>
            <collection-lexicon>true</collection-lexicon>
            <reindexer-enable>true</reindexer-enable>
            <reindexer-throttle>5</reindexer-throttle>
            <reindexer-timestamp>0</reindexer-timestamp>
            <directory-creation>manual</directory-creation>
            <maintain-last-modified>false</maintain-last-modified>
            <maintain-directory-last-modified>false</maintain-directory-last-modified>
            <inherit-permissions>false</inherit-permissions>
            <inherit-collections>false</inherit-collections>
            <inherit-quality>false</inherit-quality>
            <in-memory-limit>174080</in-memory-limit>
            <in-memory-list-size>341</in-memory-list-size>
            <in-memory-tree-size>85</in-memory-tree-size>
            <in-memory-range-index-size>11</in-memory-range-index-size>
            <in-memory-reverse-index-size>11</in-memory-reverse-index-size>
            <in-memory-triple-index-size>44</in-memory-triple-index-size>
            <large-size-threshold>1024</large-size-threshold>
            <locking>fast</locking>
            <journaling>fast</journaling>
            <journal-size>682</journal-size>
            <journal-count>2</journal-count>
            <preallocate-journals>false</preallocate-journals>
            <preload-mapped-data>false</preload-mapped-data>
            <preload-replica-mapped-data>false</preload-replica-mapped-data>
            <range-index-optimize>facet-time</range-index-optimize>
            <positions-list-max-size>256</positions-list-max-size>
            <format-compatibility>automatic</format-compatibility>
            <index-detection>automatic</index-detection>
            <expunge-locks>none</expunge-locks>
            <tf-normalization>scaled-log</tf-normalization>
            <merge-priority>lower</merge-priority>
            <merge-max-size>32768</merge-max-size>
            <merge-min-size>1024</merge-min-size>
            <merge-min-ratio>2</merge-min-ratio>
            <merge-timestamp>0</merge-timestamp>
            <retain-until-backup>false</retain-until-backup>
            <assignment-policy-name>bucket</assignment-policy-name>
        </package-database-properties>
    </config>
</package-database>

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Наличие нефильтрованного поиска сопровождается некоторыми предостережениями :

  • Они определяют результаты непосредственно по индексам без фильтрации для проверки .Это делает нефильтрованные результаты наиболее сопоставимыми с традиционными результатами в стиле поисковой системы.
  • Они включают ложноположительные результаты .Ложноположительные результаты могут возникать из ряда ситуаций, включая поиск по фразе, содержащей 3 или более слов, определенные поиски по подстановочным знакам , чувствительный к пунктуации, диакритический и / или регистрозависимый поиск.

MarkLogic предоставляет способ определить, является ли результат ложноположительным.Вы можете использовать cts:contains для этого.Этот xquery показывает, что ваш результат действительно ложно-положительный:

xquery version "1.0-ml";

declare boundary-space preserve;
declare namespace qm="http://marklogic.com/xdmp/query-meters";

let $trueCounter := 0
let $falseCounter := 0
let $query := cts:element-value-query(xs:QName('data'), 'theater* *')
let $x := 
  for $result in cts:search(fn:doc(), $query, "unfiltered")
  return
  (
  if ( cts:contains($result, $query) )
  then ( xdmp:set($trueCounter, $trueCounter + 1) )
  else ( xdmp:set($falseCounter, $falseCounter + 1) )
  )
return
<results>
  <resultTotal>{$trueCounter}</resultTotal>
  <false-positiveTotal>{$falseCounter}</false-positiveTotal>
  <elapsed-time>{xdmp:query-meters()/qm:elapsed-time/text()}
  </elapsed-time>
</results>

Поиск MarkLogic делится на два этапа:

  1. Разрешение идентификатора кандидата.ML ищет соответствующие документы из индекса.Это только кандидаты, то есть они могут быть ложными срабатываниями.Это полезно для сужения документов, поэтому нет необходимости загружать слишком много фрагментов.
  2. Идентификатор кандидата используется для загрузки фрагментов с диска.Затем каждый фрагмент будет снова проверен на соответствие начальному запросу.Этот шаг фильтрует ложные срабатывания.

При использовании нефильтрованного запроса у вас нет второго шага и, следовательно, ложных срабатываний.Вы можете узнать больше об этом здесь .

Редактировать: Этот раздел дополнительно описывает приложения, которые могут использовать нефильтрованный поиск:

  • Ваше содержание и условия поиска таковы, что вы знаете, что нефильтрованные поиски также точны (например, все поиски выполняются по документу или корням фрагмента , это односоставные запросы и не являются подстановочными, пунктуальными, диакритическими, и / или чувствительными к заглавным буквам поисками ).
  • Вы не возражаете, если есть некоторые ложные-положительные результаты, потому что результаты являются приблизительными (то есть они должны быть быстрыми, но не обязательно точными).
  • Ваш поиск возвращает большое количество результатов, и вы хотите эффективные способы перехода копределенная часть этих результатов.

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

Надеюсь, это поможет!

0 голосов
/ 26 сентября 2018

Попробуйте создать индекс диапазона элементов для элемента данных, а затем выполните следующий поиск:

let $terms :=  cts:element-value-match(xs:QName("data"),"theater* *")
return
  cts:search(
    doc(),
    cts:element-value-query(
      xs:QName('data'), 
      $terms, 
      ('wildcarded', 'case-insensitive', 'unstemmed', 'punctuation-sensitive', 'whitespace-sensitive')
    ),
    'unfiltered'
  )

Это не приведет к загрузке документа /sample/2.xml

...