2015-11-05 2 views
2

У меня возникли некоторые 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> любым способом, или есть ли другой способ решить эту проблему?

ответ

5

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

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

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

+0

Мне показалось интересным, что ML токенизирует на , когда фраза (для меня) предполагает просто игнорировать разметку. –

+1

Индексирование работает на древовидной модели, а не на символьном представлении разметки. Таким образом, существует внутренний разрыв, потому что существует целый текстовый узел. Я думаю, что есть случаи (например, это), где вы хотите, чтобы «word-through» объединил токены вместе, но это не всегда правильно. – mholstege

+0

HI Mary - Perfect - поэтому элементы во фразовом элементе по-прежнему являются отдельным узлом. Имеет смысл. Благодаря! –

2

похоже, что вы хотите добавить конфигурацию phrase-through.

Пример:

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

фраза Проходная на <b> затем будет индексироваться как «быть или не быть»

+0

У меня уже была фраза, созданная для 'sub'. Даже после этого он работает не так, как ожидалось. –

Смежные вопросы