Шаблон полнотекстового поиска

Функция

Определение шаблона полнотекстового поиска.

Спецификация
< шаблон полнотекстового поиска >::=
< не равно >::=
!
< или >::=
|
< и >::=
&
< атрибут >::=
< значение >::=
< слово >
| (['#' | '%' | '*'] '”' < строка без символа > '”' ['*'])
| (['#' | '%' | '*'] '’' < строка без символа > '’' ['*'])
< группа >::=
'('< слово > [< слово >…]')', всего до 6 слов
< расстояние >::=
< смещение >::=
целое беззнаковое число в диапазоне 1..10
< нижняя граница >::=
целое число в диапазоне -10..10
< верхняя граница >::=
целое число в диапазоне нижняя граница..10

< слово > составляют:

  • буквенно-цифровые символы (согласно стандарту UNICODE) и символ '_';

  • символы, значимые в середине слова: '@', '-', '/'. Указанные символы не могут быть первым и последним символом слова, за исключением шаблона поиска по концу или части слова;

  • специальные символы: '#', '%', '*'. Эти символы могут содержаться только в начале или в середине слова, кроме символа '*', который может быть и последним символом слова (см. таблицу 4);

  • одиночный символ '*', заменяющий любое слово.

Примечания

  1. Некоторые допустимые (см. подраздел Правила распознавания слов при полнотекстовом поиске) имена атрибутов не могут быть найдены согласно описанным правилам. Для их поиска следует использовать специальный символ '*'.

  2. Неиндексированные документы полагаются пустыми.

Примеры

а) подсчет количества непустых документов:

select count(id_doc)  from "ph" where text_doc contains '*';

б) подсчет количества документов, содержащих гипертекстовую разметку:

select count(id_doc)  from "ph" where text_doc contains '*=*';
Общие правила
  1. Значение специальных символов '#', '%', '*' определяет таблица 4.

  2. Конструкция ! < поисковое выражение > задает поиск документов, не содержащих данное поисковое выражение.

    Примеры.

    а) найти все версии документов, где отсутствует упоминание о встроенных базах данных.

    Конструкция

    select id_doc from "ph"
     where text_doc contains '!(встроенн* баз* дан*)';

    эквивалентна

    select id_doc from "ph"
     where text_doc not contains 'встроенн* баз* дан*';

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

    select id_doc from "ph"
     where text_doc contains '!встроенн* !баз* !дан*';
  3. Конструкция < поисковое выражение > | < поисковое выражение > задает поиск документов, содержащих либо первое, либо второе, либо оба поисковых выражения.

    Пример.

    Найти документы, в которых упоминается о любых встроенных системах или базах данных.

    select id_doc  from "ph"
     where text_doc contains '!встроенн* !баз* !дан*';
  4. Конструкция < поисковое выражение > [&] < поисковое выражение > задает поиск документов, содержащих одновременно оба поисковых выражения. Знак '&' может быть опущен.

    Пример.

    Подсчитать количество документов, в которых упоминается о базах данных и о СУБД ЛИНТЕР.

    select count(id_doc)  from "ph"
     where text_doc contains 'линтер* & (баз* дан*)';
  5. Конструкция (< поисковое выражение >) определяет логический порядок разбора поискового выражения.

  6. Конструкция < атрибут > = < значение > задает атрибутный поиск в документах, отвечающих спецификации XML (в том числе HTML); < атрибут > задает имя атрибута, < значение > задает значение этого атрибута.

    Фильтры ASCXML2TEXT и UNIXML2TEXT используются для файлов в форматах XML, XHTML, HTML.

    Файлы этих форматов обрабатываются следующим образом:

    • в случае XML-файла извлекаются пары < имя атрибута=значение атрибута >, которые могут быть включены в индекс в случае использования модификатора xml в конструкции create phrase index;

    • в случае HTML и XHTML файлов атрибуты элементов игнорируются. Исключение составляют META-элементы, содержащие метаинформацию, касающуюся документа в целом. META-элемент содержит 2 обязательных атрибута: NAME=Имя1 (или http-equiv) и CONTENT=Значение1.

      В случае, если Имя1 равно "Author", "Keywords" или "Description", в атрибутный индекс добавляются пары «Имя1=Значение1».

      Если Имя1="Content-Type", то Значение1 сканируется на предмет наличия информации об используемой документом кодировки, заданной в виде < charset=имя кодировки >.

      Формат файла определяется по наличию сигнатуры "< ?xml" в начале документа (которой, возможно, предшествует BOM). В случае её отсутствия считается, что документ создан в формате HTML. В противном случае тип документа определяется согласно спецификации форматов XML и XHTML;

    • теги без значений типа < display-name > игнорируются в любом случае.

    Примеры.

    а) подсчитать количество документов, которые содержат атрибут «title» со значением «Базы данных»:

    select count(id_doc)  from "ph"
     where text_doc contains 'title="Базы данных"';

    Так как значение атрибута состоит из двух слов, его следует заключить в кавычки.

    б) подсчитать количество документов, которые содержат атрибут «Author»:

    select count(id_doc)  from "ph"
     where text_doc contains 'Author=*';

    в) подсчитать количество документов, которые содержат атрибут «Company» с учетом регистра и значение «РЕЛЕКС» без учета регистра и, возможно, с ошибкой в написании:

    select count(id_doc)  from "ph"
     where text_doc contains '#Company=%Релекс';

    г) подсчитать количество документов, которые содержат атрибут «Citation» с известным окончанием значения, содержащего символ «"»:

    select count(id_doc)  from "ph"
     where text_doc contains 'Citation=*"жить хорошо!(c)"';
  7. < Фраза > задает поиск последовательно расположенных в тексте слов.

    Пример.

    select count(id_doc)  from "ph"
     where text_doc contains '"СУБД ЛИНТЕР"';
  8. < Расстояние > задает «расстояние» между парой слов. Так, значение1 (значение по умолчанию) соответствует последовательно идущим словам, значение2 показывает, что между данными словами должно находиться некоторое одно слово и т.д. Отрицательные значения указывают на обратный порядок слов.

  9. Допустимы 3 способа задания расстояния:

    • < нижняя граница > и < верхняя граница > задают интервал расстояний между словами;

    • < смещение > без указания знака задает симметричный интервал [-< смещение >, < смещение >];

    • < смещение > с указанием знака задает точное расстояние между словами;

    Примеры.

    а) подсчитать количество документов, в которых встречается точная фраза «СУБД ЛИНТЕР».

    Конструкция

    select count(id_doc) from "ph"
     where text_doc contains '"СУБД ЛИНТЕР"';

    эквивалентна

    select count(id_doc) from "ph"
     where text_doc contains '"СУБД |+1| ЛИНТЕР"';

    и эквивалентна

    select count(id_doc) from "ph"
     where text_doc contains '"СУБД |1 1| ЛИНТЕР"';

    б) подсчитать количество документов, в которых рядом встречаются слова «СУБД» и «ЛИНТЕР».

    select count(id_doc) from "ph"
     where text_doc contains '"СУБД |1| ЛИНТЕР"';
  10. < Группа > задает множество слов, из которых любое может находиться в указанной позиции.

    Пример.

    Подсчитать количество документов, в которых рядом встречаются слова «Релэкс» и одно из слов «ЛИНТЕР», «ЛАКУНА», «НЕВОД».

    select count(id_doc) from "ph"
    where text_doc contains '"РЕЛЭКС |1| (ЛИНТЕР ЛАКУНА НЕВОД)"';
  11. Длинные слова в шаблоне поиска усекаются до 64 букв.

  12. Апостроф является допустимым символом внутри слова для полнотекстового поиска (должен удваиваться).

    Пример.

    select * from TEST_SQLCHK where WORD contains 'biologist''s';