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

Пробовал сделать полнотекстовый поиск при помощи 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
19.09.2017, 09:41
    #39523059
вопрос2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
orcl_1989,

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

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

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



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

пример по ссылке http://oraclestart.blogspot.in/2013/08/oracle-text.html
...
Рейтинг: 0 / 0
19.09.2017, 11:41
    #39523168
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
все делал по примеру. как говорил ранее ни на одном этапе ошибок не было, но поиск не работает.
...
Рейтинг: 0 / 0
19.09.2017, 11:56
    #39523187
trace.log
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
А версия Ораклы какая?
...
Рейтинг: 0 / 0
19.09.2017, 11:59
    #39523195
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
oracle 12.2.01
...
Рейтинг: 0 / 0
19.09.2017, 12:13
    #39523214
trace.log
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
...
Рейтинг: 0 / 0
19.09.2017, 12:42
    #39523235
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
Поиск нужен по словоформе, а здесь про соответствие собственных имен.
...
Рейтинг: 0 / 0
19.09.2017, 12:57
    #39523242
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
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
19.09.2017, 19:26
    #39523469
Vladimir Filin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
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
19.09.2017, 19:32
    #39523470
Vladimir Filin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
Vladimir Filin,

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

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

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

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

Гляньте
Oracle Text russian morphology

.....
stax
...
Рейтинг: 0 / 0
20.09.2017, 16:21
    #39523824
Vladimir Filin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
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
20.09.2017, 16:36
    #39523836
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
Vladimir Filin

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

у меня в 12.2.0.1

select * from docs where contains(text, '$идти') > 0; ничего не возвращает.
...
Рейтинг: 0 / 0
20.09.2017, 17:24
    #39523897
Vladimir Filin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
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
21.09.2017, 15:38
    #39524412
orcl_1989
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Полнотекстовый поиск при помощи Oracle Text, почему не ищет?
Все таки дело в кодировке.

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


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