2017-02-09 30 views
1

Я выполняю КТСА: поиск с «нефильтрованные» вариант и подстановочный поиск включены (означает прохождение «безразличный»).караты: поиск возвращает неожиданные результаты для нефильтрованной опции поиска, когда подстановочный включен

В моей базе данных, я вставил 5 xml документов, которые я вставил ниже.

В приведенных ниже каратах: запрос, если значение journalTitle элемента содержит символа (*) это возвращающееся мне все 5 документов.

, например: "D *", "ди *", "Dixi *"

Даже если я передаю "Мохи * T" в качестве значения для journalTitle элемента, я получаю все пять документов в результате.

Для "отфильтрованный" вариант работает нормально.

Мне любопытно, почему это поведение? и, пожалуйста, также дайте мне знать, как я могу исправить это для «нефильтрованный» вариант.

Я много искал в Google относительно этого, но не нашел решение.

Вы найдете ниже каратов: поиск запросов и XML-файлы

КТС: запрос

cts:search(fn:collection(), cts:element-query(
     xs:QName("root"), 
     cts:and-query(
      (
      cts:element-value-query(xs:QName("sourceType"), "JA", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1), 
      cts:element-value-query(xs:QName("journalTitle"), "mohi*t", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1), 
      cts:element-value-query(xs:QName("title"), "title1", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1), 
      cts:element-value-query(xs:QName("volume"), "volume0", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1) 
     ), 
     () 
     ), 
     () 
     ),"unfiltered") 

содержание XML - вставили все пять XMLs:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <journalTitle>Dinesh</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 
- 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <journalTitle>Dixit</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 
- 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <journalTitle>Prashant</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 
- 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <journalTitle>GAYARI</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 
- 
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <journalTitle>KEVAL</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 

Вы может потребоваться результат xdmp: plan, поэтому я вставил его ниже

xdmp: результат плана:

<qry:query-plan xmlns:qry="http://marklogic.com/cts/query"> 
    <qry:info-trace>xdmp:eval("xdmp:plan(cts:search(fn:collection(), cts:element-query(&amp;#10; ...",(), &lt;options xmlns="xdmp:eval"&gt;&lt;database&gt;12874763000056740838&lt;/database&gt;&lt;root&gt;C:\RSuite\modules...&lt;/options&gt;)</qry:info-trace> 
    <qry:info-trace>Analyzing path for search: fn:collection()</qry:info-trace> 
    <qry:info-trace>Step 1 is searchable: fn:collection()</qry:info-trace> 
    <qry:info-trace>Path is fully searchable.</qry:info-trace> 
    <qry:info-trace>Gathering constraints.</qry:info-trace> 
    <qry:info-trace>Search query contributed 1 constraint: cts:element-query(fn:QName("", "root"), cts:and-query((cts:element-value-query(fn:QName("", "sourceType"), "JA", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1), cts:element-value-query(fn:QName("", "journalTitle"), "mohi*t", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1), cts:element-value-query(fn:QName("", "title"), "title1", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1), cts:element-value-query(fn:QName("", "volume"), "volume0", ("case-insensitive","diacritic-sensitive","punctuation-sensitive","whitespace-sensitive","wildcarded","lang=en"), 1)),()),())</qry:info-trace> 
    <qry:partial-plan> 
     <qry:or-two-queries> 
      <qry:element-query> 
       <qry:key>10866465315185201428</qry:key> 
       <qry:annotation>element(root)</qry:annotation> 
       <qry:and-query> 
        <qry:term-query weight="1"> 
         <qry:key>15329831187071590131</qry:key> 
         <qry:annotation>element(sourceType,value("JA"))</qry:annotation> 
        </qry:term-query> 
        <qry:term-query weight="0"> 
         <qry:key>3029765743981997321</qry:key> 
         <qry:annotation>element(journalTitle)</qry:annotation> 
        </qry:term-query> 
        <qry:term-query weight="1"> 
         <qry:key>4206353216190327061</qry:key> 
         <qry:annotation>element(title,value("title1"))</qry:annotation> 
        </qry:term-query> 
        <qry:term-query weight="1"> 
         <qry:key>7729558342335907080</qry:key> 
         <qry:annotation>element(volume,value("volume0"))</qry:annotation> 
        </qry:term-query> 
       </qry:and-query> 
      </qry:element-query> 
      <qry:and-two-queries> 
       <qry:term-query weight="0"> 
        <qry:key>837267169796541076</qry:key> 
        <qry:annotation>link-child(descendant(element(root)))</qry:annotation> 
       </qry:term-query> 
       <qry:and-query> 
        <qry:term-query weight="1"> 
         <qry:key>15329831187071590131</qry:key> 
         <qry:annotation>element(sourceType,value("JA"))</qry:annotation> 
        </qry:term-query> 
        <qry:term-query weight="0"> 
         <qry:key>3029765743981997321</qry:key> 
         <qry:annotation>element(journalTitle)</qry:annotation> 
        </qry:term-query> 
        <qry:term-query weight="1"> 
         <qry:key>4206353216190327061</qry:key> 
         <qry:annotation>element(title,value("title1"))</qry:annotation> 
        </qry:term-query> 
        <qry:term-query weight="1"> 
         <qry:key>7729558342335907080</qry:key> 
         <qry:annotation>element(volume,value("volume0"))</qry:annotation> 
        </qry:term-query> 
       </qry:and-query> 
      </qry:and-two-queries> 
     </qry:or-two-queries> 
    </qry:partial-plan> 
    <qry:info-trace>Executing search.</qry:info-trace> 
    <qry:final-plan> 
     <qry:and-query> 
      <qry:or-two-queries> 
       <qry:element-query> 
        <qry:key>10866465315185201428</qry:key> 
        <qry:annotation>element(root)</qry:annotation> 
        <qry:and-query> 
         <qry:term-query weight="1"> 
          <qry:key>15329831187071590131</qry:key> 
          <qry:annotation>element(sourceType,value("JA"))</qry:annotation> 
         </qry:term-query> 
         <qry:term-query weight="0"> 
          <qry:key>3029765743981997321</qry:key> 
          <qry:annotation>element(journalTitle)</qry:annotation> 
         </qry:term-query> 
         <qry:term-query weight="1"> 
          <qry:key>4206353216190327061</qry:key> 
          <qry:annotation>element(title,value("title1"))</qry:annotation> 
         </qry:term-query> 
         <qry:term-query weight="1"> 
          <qry:key>7729558342335907080</qry:key> 
          <qry:annotation>element(volume,value("volume0"))</qry:annotation> 
         </qry:term-query> 
        </qry:and-query> 
       </qry:element-query> 
       <qry:and-two-queries> 
        <qry:term-query weight="0"> 
         <qry:key>837267169796541076</qry:key> 
         <qry:annotation>link-child(descendant(element(root)))</qry:annotation> 
        </qry:term-query> 
        <qry:and-query> 
         <qry:term-query weight="1"> 
          <qry:key>15329831187071590131</qry:key> 
          <qry:annotation>element(sourceType,value("JA"))</qry:annotation> 
         </qry:term-query> 
         <qry:term-query weight="0"> 
          <qry:key>3029765743981997321</qry:key> 
          <qry:annotation>element(journalTitle)</qry:annotation> 
         </qry:term-query> 
         <qry:term-query weight="1"> 
          <qry:key>4206353216190327061</qry:key> 
          <qry:annotation>element(title,value("title1"))</qry:annotation> 
         </qry:term-query> 
         <qry:term-query weight="1"> 
          <qry:key>7729558342335907080</qry:key> 
          <qry:annotation>element(volume,value("volume0"))</qry:annotation> 
         </qry:term-query> 
        </qry:and-query> 
       </qry:and-two-queries> 
      </qry:or-two-queries> 
     </qry:and-query> 
    </qry:final-plan> 
    <qry:info-trace>Selected 5 fragments</qry:info-trace> 
    <qry:result estimate="5"/> 
</qry:query-plan> 

Извинение, если есть какая-либо ошибка gramatical.

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

ответ

3

Поиск по шаблону зависит от соответствующего индекса или фильтрации. Вы проверяете, что активировали fast element trailing wildcard searches, а также trailing wildcard searches в своей базе? Это будет работать для шаблонов с не менее чем 4 стартовыми символами. Для трех стартовых символов вам также необходимо включить fast element character searches и, возможно, также three character searches.

MarkLogic также позволяет выполнять точные нефильтрованные подстановочные знаки для шаблонов, начинающихся с двух или одного символа.Один из способов заключается в предоставлении two character searches и one character searches варианты, но в соответствии с документацией, вам не нужно, если вы включите трехсимвольные один в сочетании со словом лексикона:

два поиска символов определяет, будут ли индексы должны создаваться до , активировать поиск подстановочных знаков, в котором шаблон поиска содержит два последовательных символа без символа (например, ab *), . Этот индекс не нужен, если у вас есть три поиска символов и словарный словарь.

поиск по одному символу указывает, должны ли индексы создаваться в включить групповые поиски, в которых шаблон поиска содержит одиночный несимметричный символ (например, a *). Этот индекс не нужен, если у вас есть три поиска символов и словарная лексика.

(источник: Администратор UI вкладки Справка)

Thnx Дейву для указания на Understanding the Wildcard Indexes, в котором все объяснено более подробно.

HTH!

+1

Существуют параметры индекса, позволяющие осуществлять поиск по одному или двум символам. Однако для поддержки этого требуется несколько больших индексов, поэтому клиентам предлагается рассмотреть, могут ли они быть довольны трехсимволами. Подробнее читайте в разделе [Общие сведения о индексах подстановочных знаков] (http://docs.marklogic.com/guide/search-dev/wildcard#id_61884). –

3

Это лучшая идея, чтобы включить словарный словарь с кодировкой кодовых точек в сочетании с тремя символьными символами. Индекс одного и двух символов очень дорог.