Игнорировать элементы в cts:search

У меня есть несколько XML-документов, которые имеют такую ​​структуру:

<root>
  <intro>...</intro>
   ...
  <body>
    <p>..................
       some text CO<sub>2</sub>
       .................. </p>
   </body>
</root>

Теперь я хочу найти все результаты с фразой CO2, а также хочу получить результаты вышеуказанного типа в результатах поиска. Для этой цели я использую этот запрос -

cts:search 
(fn:collection ("urn:iddn:collections:searchable"), 
cts:element-query
          (
            fn:QName("http://iddn.icis.com/ns/fields","body"), 
            cts:word-query
            (
              "CO2", 
              ("case-insensitive","diacritic-sensitive","punctuation-insensitive",
                "whitespace-sensitive","unstemmed","unwildcarded","lang=en"),
              1
            )
          )
, 
("unfiltered", "score-logtfidf"), 
0.0)

Но используя это, я не могу получить документ с CO<sub>2</sub>. Я получаю данные только с простой фразой CO2.

Если я заменю поисковую фразу на CO 2, то смогу получить документы только с CO<sub>2</sub>, а не с CO2

Я хочу получить комбинированные данные для CO<sub>2</sub> и CO2 в качестве результатов поиска.

Итак, могу ли я каким-либо образом игнорировать <sub> или есть другой способ решить эту проблему?


person Ankit Bhardwaj    schedule 05.11.2015    source источник


Ответы (2)


Проблема здесь в токенизации. «CO2» — это токен, состоящий из одного слова. CO‹sub>2‹/sub>, даже со сквозной фразой, представляет собой фразу из двух словесных токенов: «CO» и «2». Как «черный дрозд» не соответствует «черной птице», так и «СО2» не соответствует «СО2». Параметр сквозной фразы просто означает, что мы готовы искать фразу, которая пересекает границу элемента ‹sub>.

Вы не можете объединить CO‹sub>2‹/sub> в один токен, но вы можете использовать настраиваемые переопределения токенизации, чтобы разбить «CO2» на два токена. Определите поле и определите переопределения для цифр как «символ». Это сделает каждую цифру отдельным маркером и разобьет «CO2» на два маркера в контексте этого поля. Затем вам нужно будет заменить слово-запрос на поле-слово-запрос.

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

person mholstege    schedule 05.11.2015
comment
Мне кажется интересным, что ML токенизирует ‹sub›, когда сквозная фраза (мне) предлагает просто игнорировать разметку. - person David Ennis; 06.11.2015
comment
Индексирование работает с древовидной моделью, а не с символьным представлением разметки. Таким образом, есть внутренний разрыв, потому что есть совершенно другой текстовый узел. Я думаю, что есть случаи (такие как этот), когда вам нужно сквозное слово, чтобы соединить токены вместе, но это не всегда правильно. - person mholstege; 08.11.2015
comment
HI Mary - Perfect - так что элементы в сквозном элементе фразы по-прежнему являются отдельными узлами. Имеет смысл. Спасибо! - person David Ennis; 08.11.2015

Похоже, вы хотите добавить конфигурацию сквозную фразу.

Пример:

<p>to <b>be</b> or not to be</p> 

После этого сквозная фраза на <b> будет проиндексирована как "быть или не быть".

person David Ennis    schedule 05.11.2015
comment
У меня уже есть сквозная фраза для sub. Даже после этого он не работает, как ожидалось. - person Ankit Bhardwaj; 05.11.2015