powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
20 сообщений из 20, страница 1 из 1
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523052
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Пробовал сделать полнотекстовый поиск при помощи Oracle Text. Все сделал как в http://oraclestart.blogspot.in/2013/08/oracle-text.html
создание индекса прошло без ошибок.

Запрос select * from docs where contains(text, 'саша') > 0; возвращает нужную строку, а вот

select * from docs where contains(text, '$идти') > 0; ничего не возвращает.

Если просмотреть служебную таблицу DR$DOCS_IDX$I, то в TOKEN_TEXT есть значение "ИДТИ"

В чем может быть причина?
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523059
вопрос2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
orcl_1989,

размер БОЛЬШИЕ - маленькие символы могут быть?
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523071
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в DR$DOCS_IDX$I все в верхнем регистре, поиск не работает для нижнего и не работает для верхнего.
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523150
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orcl_1989,

Может я не очень много работал с contains, но почему/зачем Вы вставили $

Код: plsql
1.
select * from docs where contains(text, '$идти') > 0



т.е. по умолчанию Oracle работает только с английским и французским текстом (как я помню), а русские интерпритации надо добавлять доп словарем
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523165
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
$ - оператор стемминга.

пример по ссылке http://oraclestart.blogspot.in/2013/08/oracle-text.html
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523168
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
все делал по примеру. как говорил ранее ни на одном этапе ошибок не было, но поиск не работает.
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523187
trace.log
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А версия Ораклы какая?
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523195
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
oracle 12.2.01
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523214
trace.log
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523235
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поиск нужен по словоформе, а здесь про соответствие собственных имен.
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523242
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orcl_1989,

Может Вы что то недопоняли, может я

https://docs.oracle.com/database/121/CCREF/amultlng.htm#CCREF1350

D.2.3.5 Index stems
This feature enables you to specify a stemmer for stem indexing. Tokens are stemmed to a single base form at index time in addition to the normal forms. Specifying index stems enables better query performance for stem queries, for example $computed.

This feature is supported for English, Dutch, French, German, Italian, and Spanish.

Но даже в этом случае слово "идти" может быть написано в тексте как "шел" "идти" "ходил" ... В начале предложения с первой большой буквы. Если слово ВСЕ большими буквами, я думаю, его воспримут как имя собственное и в поиске оно участвовать не будет. Но это мои догадки. Можно еще почитать про About
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523469
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL....а русские интерпритации надо добавлять доп словарем
Да. Без русского словаря не получится. Тоже пробовал. Словари для Риссии есть готовые, но платные.

вопрос2 размер БОЛЬШИЕ - маленькие символы могут быть?
Регистр и пробелы значения не имеют. Ещё важно, что только цифры он исключает из поиска.

Примерчик:


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
CREATE TABLE ott
(
 id      NUMBER(2) NOT NULL,
 texts   VARCHAR2(2000 CHAR),
 CONSTRAINT ott_pk PRIMARY KEY(id)
);

INSERT INTO ott(id, texts)
      VALUES (
              1,
              'Пробовал сделать полнотекстовый поиск при помощи Oracle Text. Все сделал как в http://oraclestart.blogspot.in/2013/08/oracle-text.html
создание индекса прошло без ошибок.

Запрос select * from docs where contains(text, ''саша'') > 0; возвращает нужную строку, а вот

select * from docs where contains(text, ''$идти'') > 0; ничего не возвращает.

Если просмотреть служебную таблицу DR$DOCS_IDX$I, то в TOKEN_TEXT есть значение "ИДТИ"

В чем может быть причина? );');

INSERT INTO ott(id, texts)
      VALUES (
              2,
              'Может Вы что то недопоняли, может я

https://docs.oracle.com/database/121/CCREF/amultlng.htm#CCREF1350

D.2.3.5 Index stems
This feature enables you to specify a stemmer for stem indexing. Tokens are stemmed to a single base form at index time in addition to the normal forms. Specifying index stems enables better query performance for stem queries, for example $computed.

This feature is supported for English, Dutch, French, German, Italian, and Spanish.

Но даже в этом случае слово "идти" может быть написано в тексте как "шел" "идти" "ходил" ... В начале предложения с первой большой буквы. Если слово ВСЕ большими буквами, я думаю, его воспримут как имя собственное и в поиске оно участвовать не будет. Но это мои догадки. Можно еще почитать про About');

/*==============================================================*/
/* Index: Oracle Text                                           */
/*==============================================================*/
CREATE INDEX idx_oratxt_texts
 ON ott(texts)
 INDEXTYPE IS ctxsys.context
  PARAMETERS('STOPLIST CTXSYS.EMPTY_STOPLIST SYNC (ON COMMIT)');

BEGIN
 DBMS_STATS.gather_table_stats(ownname => USER, tabname => 'OTT', estimate_percent => 100, cascade => TRUE);
 DBMS_STATS.gather_index_stats(ownname => USER, indname => 'IDX_ORATXT_TEXTS', estimate_percent => 100);
END;
/



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT id  FROM ott WHERE contains(texts, 'саша') > 0;
        ID
----------
         1
1 row selected.

SELECT id  FROM ott WHERE contains(texts, 'САША') > 0;
        ID
----------
         1
1 row selected.


SELECT id  FROM ott WHERE contains(texts, 'Саша') > 0;
        ID
----------
         1
1 row selected.



Код: plsql
1.
2.
SELECT id  FROM ott WHERE contains(texts, '$шла') > 0;
no rows selected.



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT id  FROM ott WHERE contains(texts, 'А AND сАША AND Может AND иДТИ AND  и% AND без AND ИНДЕКСА') > 0;
        ID
----------
         1
1 row selected.

SELECT id  FROM ott WHERE contains(texts, 'French AND German AND что то недопоняли') > 0;
        ID
----------
         2
1 row selected.



...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523470
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Filin,

и ещё недокументированная Ж#А: Oracle Text index нужно дропать первым и ЯВНО! Cascade для них не поддерживается -- имя индека зависает в словаре. Если завис, нужно опять создать родительскую таблицу, дропнуть индекс, дропнуть таблицу.
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523494
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть возможность отказаться от oracle text делай это побыстрее. Более глючный у оракла только json.
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523642
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Filin
Да. Без русского словаря не получится. Тоже пробовал. Словари для Риссии есть готовые, но платные.

Как уже говорил все создается без проблем и
Если просмотреть служебную таблицу DR$DOCS_IDX$I, то в TOKEN_TEXT есть значение "ИДТИ"

т.е. проблема не в словарях, а в использовании оператора стемминга $, как я понимаю он не отрабатывает, но если

select * from docs where contains(text, '$шла') > 0; - то возвращает нужную строку.
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523670
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orcl_1989,

Гляньте
Oracle Text russian morphology

.....
stax
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523824
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orcl_1989,

Проверил Пример . Интересно. Считал, что словоформы это отдельный словарь, подгружаемый для русского языка.

В 11R2 получил DRG-11135 :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select * from v$version;

BANNER                                                                          
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production    
PL/SQL Release 11.2.0.4.0 - Production                                          
CORE	11.2.0.4.0	Production                                                      
TNS for Linux: Version 11.2.0.4.0 - Production                                  
NLSRTL Version 11.2.0.4.0 - Production                                          

5 rows selected.



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create table docs (id number not null, text varchar2(1000 char) not null);
insert into docs values (1, 'Шла Саша по шоссе и сосала сушку.');
insert into docs values (2, 'London is the capital of The United Kingdom of Great Britain and Northern Ireland.');
begin
    ctx_ddl.create_preference('my_wordlist', 'BASIC_WORDLIST');
    ctx_ddl.create_preference('my_lexer', 'AUTO_LEXER');
    ctx_ddl.set_attribute('my_lexer', 'INDEX_STEMS','YES');
end;
create index docs_idx on docs (text) indextype is ctxsys.context parameters ('LEXER my_lexer WORDLIST my_wordlist');

Table created.
1 row created.
1 row created.
PL/SQL procedure successfully completed.
create index docs_idx on docs (text) indextype is ctxsys.context parameters ('LEXER my_lexer WORDLIST my_wordlist')
Error at line 9
ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-20000: Oracle Text error:
DRG-10502: index DOCS_IDX does not exist
DRG-11135: feature not generally available

ORA-06512: at "CTXSYS.DRUE", line 160
ORA-06512: at "CTXSYS.TEXTINDEXMETHODS", line 366




В 12.1 Non-CDB всё работает, как в примере :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select banner from v$version;

BANNER                                                                          
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production    
PL/SQL Release 12.1.0.2.0 - Production                                          
CORE	12.1.0.2.0	Production                                                      
TNS for Linux: Version 12.1.0.2.0 - Production                                  
NLSRTL Version 12.1.0.2.0 - Production                                          

5 rows selected.



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table docs (id number not null, text varchar2(1000 char) not null);
insert into docs values (1, 'Шла Саша по шоссе и сосала сушку.');
insert into docs values (2, 'London is the capital of The United Kingdom of Great Britain and Northern Ireland.');
begin
    ctx_ddl.create_preference('my_wordlist', 'BASIC_WORDLIST');
    ctx_ddl.create_preference('my_lexer', 'AUTO_LEXER');
    ctx_ddl.set_attribute('my_lexer', 'INDEX_STEMS','YES');
end;
create index docs_idx on docs (text) indextype is ctxsys.context parameters ('LEXER my_lexer WORDLIST my_wordlist');

Table created.
1 row created.
1 row created.
PL/SQL procedure successfully completed.
Index created.



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
select id from docs where contains(text, 'саша') > 0;

        ID
----------
         1
1 row selected.

select id from docs where contains(text, '$идти') > 0;

        ID
----------
         1
1 row selected.

select id from docs where contains(text, 'united') > 0;

        ID
----------
         2
1 row selected.

select id from docs where contains(text, 'uni%') > 0;

        ID
----------
         2
1 row selected.




В 12.1 PDB тоже всё работает:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select banner from v$version;

BANNER                                                                          
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production    
PL/SQL Release 12.1.0.2.0 - Production                                          
CORE	12.1.0.2.0	Production                                                      
TNS for Linux: Version 12.1.0.2.0 - Production                                  
NLSRTL Version 12.1.0.2.0 - Production                                          

5 rows selected.



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table docs (id number not null, text varchar2(1000 char) not null);
insert into docs values (1, 'Шла Саша по шоссе и сосала сушку.');
insert into docs values (2, 'London is the capital of The United Kingdom of Great Britain and Northern Ireland.');
begin
    ctx_ddl.create_preference('my_wordlist', 'BASIC_WORDLIST');
    ctx_ddl.create_preference('my_lexer', 'AUTO_LEXER');
    ctx_ddl.set_attribute('my_lexer', 'INDEX_STEMS','YES');
end;
create index docs_idx on docs (text) indextype is ctxsys.context parameters ('LEXER my_lexer WORDLIST my_wordlist');

Table created.
1 row created.
1 row created.
PL/SQL procedure successfully completed.
Index created.



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
[SRC PLSQL]
select id from docs where contains(text, 'саша') > 0;

        ID
----------
         1
1 row selected.

select id from docs where contains(text, '$идти') > 0;

        ID
----------
         1
1 row selected.

select id from docs where contains(text, 'united') > 0;

        ID
----------
         2
1 row selected.

select id from docs where contains(text, 'uni%') > 0;

        ID
----------
         2
1 row selected.



...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523836
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir Filin

какая кодировка базы?

у меня в 12.2.0.1

select * from docs where contains(text, '$идти') > 0; ничего не возвращает.
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39523897
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orcl_1989 какая кодировка базы?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT * FROM nls_database_parameters;

NLS_RDBMS_VERSION	12.1.0.2.0
NLS_NCHAR_CONV_EXCP	FALSE
NLS_LENGTH_SEMANTICS	BYTE
NLS_COMP	BINARY
NLS_DUAL_CURRENCY	$
NLS_TIMESTAMP_TZ_FORMAT	DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT	HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT	DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT	HH.MI.SSXFF AM
NLS_SORT	BINARY
NLS_DATE_LANGUAGE	AMERICAN
NLS_DATE_FORMAT	DD-MON-RR
NLS_CALENDAR	GREGORIAN
NLS_NUMERIC_CHARACTERS	.,
NLS_NCHAR_CHARACTERSET	AL16UTF16
NLS_CHARACTERSET	AL32UTF8
NLS_ISO_CURRENCY	AMERICA
NLS_CURRENCY	$
NLS_TERRITORY	AMERICA
NLS_LANGUAGE	AMERICAN



Уточнение про 11R2: это у меня на 11.2.0.4.0 не построился индекс.
Проверил на 11.2.0.2.0 -- всё строится и работает
Кодировки такие же, как в 12.1
...
Рейтинг: 0 / 0
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
    #39524412
orcl_1989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все таки дело в кодировке.

Поставил 12.2.0.1 с параметрами:

авторSELECT * FROM nls_database_parameters;

NLS_RDBMS_VERSION 12.2.0.1.0
NLS_NCHAR_CONV_EXCP FALSE
NLS_LENGTH_SEMANTICS BYTE
NLS_COMP BINARY
NLS_DUAL_CURRENCY $
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_SORT BINARY
NLS_DATE_LANGUAGE AMERICAN
NLS_DATE_FORMAT DD-MON-RR
NLS_CALENDAR GREGORIAN
NLS_NUMERIC_CHARACTERS .,
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8
NLS_ISO_CURRENCY AMERICA
NLS_CURRENCY $
NLS_TERRITORY AMERICA
NLS_LANGUAGE AMERICAN

и все заработало.

Всем спасибо за помощь.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]