cts: поиск возвращает неожиданные результаты для опции нефильтрованного поиска, когда включен подстановочный знак
Я выполняю команду cts: search с параметром "без фильтра", и поиск по шаблону включен (означает пропуск "по шаблону").
В мою базу данных я вставил 5 XML-документов, которые я вставил ниже.
В приведенном ниже запросе cts: если значение элемента journalTitle содержит подстановочный знак (*), он возвращает мне все 5 документов.
например: "d *", "di *", "dixi *"
Даже если я передаю "mohi * t" в качестве значения для элемента journalTitle, я получаю все пять документов в результате.
Для "отфильтрованного" варианта он работает нормально.
Мне интересно, почему это поведение? и, пожалуйста, также дайте мне знать, как я могу исправить это для "нефильтрованного" варианта.
Я много искал в Google по этому поводу, но не нашел решения.
Пожалуйста, найдите ниже CTS: поисковый запрос и 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(&#10; ...", (), <options xmlns="xdmp:eval"><database>12874763000056740838</database><root>C:\RSuite\modules...</options>)</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>
Извинения, если есть какая-либо грамматическая ошибка.
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
2 ответа
Лучше включить словарный запас с сопоставлением кодов в сочетании с подстановочными знаками из трех символов. Одно- и двухсимвольные индексы очень и очень дороги.
Поиск с подстановочными знаками полагается либо на соответствующий индекс, либо на фильтрацию. Вы проверили, что вы включили fast element trailing wildcard searches
и, возможно, также trailing wildcard searches
в вашей базе данных? Это будет работать для шаблонов с минимум 4 начальными символами. Для трех стартовых символов вам также необходимо включить fast element character searches
и, возможно, также three character searches
,
MarkLogic также позволяет выполнять точный поиск без фильтрации шаблонов, которые начинаются с двух или одного символа. Одним из способов является включение two character searches
а также one character searches
опции, но в соответствии с документацией, вам не нужно, если вы включаете трехзначный символ в сочетании со словом лексикон:
двухсимвольный поиск указывает, следует ли создавать индексы для включения поиска с использованием подстановочных знаков, когда шаблон поиска содержит два последовательных не подстановочных знака (например, ab*). Этот индекс не нужен, если у вас есть три поиска символов и словарный запас слова.
Поиск по одному символу указывает, следует ли создавать индексы для включения поиска по шаблону, когда шаблон поиска содержит один не подстановочный знак (например, *). Этот индекс не нужен, если у вас есть три поиска символов и словарный запас слова.
(источник: вкладка "Справка интерфейса администратора")
Спасибо Дэйву за указание на Понимание подстановочных знаков, в которых все объясняется более подробно.
НТН!