Шаблон полнотекстового поиска
Функция
Определение шаблона полнотекстового поиска.
Спецификация
::=
::=
::=
::=
::=
::=
::=
| (['#' | '%' | '*'] '”' < строка без символа > '”' ['*'])
| (['#' | '%' | '*'] '’' < строка без символа > '’' ['*'])
::=
::=
::=
::=
::=
< слово >
составляют:
-
буквенно-цифровые символы (согласно стандарту UNICODE) и символ '_';
-
символы, значимые в середине слова: '@', '-', '/'. Указанные символы не могут быть первым и последним символом слова, за исключением шаблона поиска по концу или части слова;
-
специальные символы: '#', '%', '*'. Эти символы могут содержаться только в начале или в середине слова, кроме символа '*', который может быть и последним символом слова (см. таблицу 4);
-
одиночный символ '*', заменяющий любое слово.
Примечания
-
Некоторые допустимые (см. подраздел Правила распознавания слов при полнотекстовом поиске) имена атрибутов не могут быть найдены согласно описанным правилам. Для их поиска следует использовать специальный символ '*'.
-
Неиндексированные документы полагаются пустыми.
Примеры
а) подсчет количества непустых документов:
select count(id_doc) from "ph" where text_doc contains '*';
б) подсчет количества документов, содержащих гипертекстовую разметку:
select count(id_doc) from "ph" where text_doc contains '*=*';
Общие правила
-
Значение специальных символов '#', '%', '*' определяет таблица 4.
-
Конструкция ! < поисковое выражение > задает поиск документов, не содержащих данное поисковое выражение.
Примеры.
а) найти все версии документов, где отсутствует упоминание о встроенных базах данных.
Конструкция
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 '!встроенн* !баз* !дан*';
-
Конструкция
< поисковое выражение > | < поисковое выражение >
задает поиск документов, содержащих либо первое, либо второе, либо оба поисковых выражения.Пример.
Найти документы, в которых упоминается о любых встроенных системах или базах данных.
select id_doc from "ph" where text_doc contains '!встроенн* !баз* !дан*';
-
Конструкция
< поисковое выражение > [&] < поисковое выражение >
задает поиск документов, содержащих одновременно оба поисковых выражения. Знак '&' может быть опущен.Пример.
Подсчитать количество документов, в которых упоминается о базах данных и о СУБД ЛИНТЕР.
select count(id_doc) from "ph" where text_doc contains 'линтер* & (баз* дан*)';
-
Конструкция
(< поисковое выражение >)
определяет логический порядок разбора поискового выражения. -
Конструкция
< атрибут > = < значение >
задает атрибутный поиск в документах, отвечающих спецификации 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)"';
-
-
< Фраза >
задает поиск последовательно расположенных в тексте слов.Пример.
select count(id_doc) from "ph" where text_doc contains '"СУБД ЛИНТЕР"';
-
< Расстояние >
задает «расстояние» между парой слов. Так, значение1 (значение по умолчанию) соответствует последовательно идущим словам, значение2 показывает, что между данными словами должно находиться некоторое одно слово и т.д. Отрицательные значения указывают на обратный порядок слов. -
Допустимы 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| ЛИНТЕР"';
-
-
< Группа >
задает множество слов, из которых любое может находиться в указанной позиции.Пример.
Подсчитать количество документов, в которых рядом встречаются слова «Релэкс» и одно из слов «ЛИНТЕР», «ЛАКУНА», «НЕВОД».
select count(id_doc) from "ph" where text_doc contains '"РЕЛЭКС |1| (ЛИНТЕР ЛАКУНА НЕВОД)"';
-
Длинные слова в шаблоне поиска усекаются до 64 букв.
-
Апостроф является допустимым символом внутри слова для полнотекстового поиска (должен удваиваться).
Пример.
select * from TEST_SQLCHK where WORD contains 'biologist''s';