Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Точный поиск с помощью Oracle Text (contains) / 16 сообщений из 16, страница 1 из 1
03.11.2004, 17:59
    #32767372
GRY
GRY
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
Имеется Oracle 8.1.7:
SQL> desc gry_test;
Name Type Nullable Default Comments
---- ------------- -------- ------- --------
TEXT VARCHAR2(100) Y

SQL> select * from gry_test;

TEXT
-------------
bb aa cc
aa aa bb cc
aa
aa bb cc aa
aaa bbb
ccc
ccc aaa

7 rows selected

На таблице gry_test постоен доменный индекс по колонке text

SQL> select g.*, score(1) from gry_test g
2 where contains(text, 'aa', 1) > 0;

TEXT SCORE(1)
------------- ----------
aa aa bb cc 7
aa 4
aa bb cc aa 7
bb aa cc 4

Требуется отобрать только те строки из gry_test, которые _ТОЧНО_ совпадают с запросом - в данном случае 'aa'
Хочется обойтись без построения обычного индекса по полю text (т.к. в дальнейшем предполагается использование CLOB и RCO)

пока из идей есть:
1. Добавить в where:
and dbms_lob.getlength(text) = 'aa' (но тогда придется в поле text хранить уже нормализованные средствами RCO значения)
2. Мутить со склейкой таблицы gry_test и таблиц доменного индекса, с целью определения, что для заданной строки в таблице gry_test было проиндексированно _только_ одно слово 'aa'

Может быть есть какое-то более красивое решение?

С уважением, Илья
Код: plaintext
Код: plaintext
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.08.2010, 12:12
    #36799782
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
UP.

Хоть тема и старая, но актуальная. Возможно за 6 лет что-то новое появилось.

У меня тот же вопрос как и у ТС. Пример он привел хороший.

Можно ли как то через настройки индекса влиять на SCORE?

Oracle 10.2.
...
Рейтинг: 0 / 0
19.08.2010, 12:15
    #36799798
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
Кореец,

Можно влиять на score через text query language.
...
Рейтинг: 0 / 0
19.08.2010, 12:21
    #36799816
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
-2-,

А поподробнее?
...
Рейтинг: 0 / 0
19.08.2010, 12:25
    #36799832
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
Кореец,

Oracle Text CONTAINS Query Operators weight (*)

The weight operator multiplies the score by the given factor, topping out at 100 when the score exceeds 100. For example, the query cat, dog*2 sums the score of cat with twice the score of dog, topping out at 100 when the score is greater than 100.
...
Рейтинг: 0 / 0
19.08.2010, 12:32
    #36799856
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
На всякий случай поясню.
1. Язык используется английский.
2. Есть тезариус который устанавливает связи между фразами( только синонимы). Небольшой.
3. Все остальное по умолчанию.

Проиндексированы строки БД. Там просто текст вида "AAA BBB". Никаких xml и т.п.
Для поиска используется простой вариант вида contains(text,'AAA, SYN(BBB, tes)',1) > 0.

Требуется чтобы в примере ТС, при поиск contains рейтинг строки "aa" был выше хотя бы рейтинга строки "bb aa cc".

Оракл Текст вроде реализуется по алгоритму Салтона. По нему такой вот мусор получается на результат не влияет. Вот есть какая то возможность повлиять в этом случае на скоринг?

Возможно в самом операторе contains есть какие то доп условия. Да там есть твозможность учитывать или нет порядок слов, также максим расстояние между поисковыми словами, но в данном случае в условии всего один поисковый термин. Для этого вариант я не нашел способов сделать поиск строже.

Поделитесь опытом, если у кого такой был.))
...
Рейтинг: 0 / 0
19.08.2010, 12:37
    #36799875
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
-2-,

Спасибо. (*) - судя по описанию это же как бы мультиплитактор термина. говорит о том сколько раз он должен встретится с документе?

Но в данном случае в строках.
"bb aa cc"
"aa"

"aa" встречается по одному разу.
...
Рейтинг: 0 / 0
19.08.2010, 13:24
    #36800023
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
КореецТребуется чтобы в примере ТС, при поиск contains рейтинг строки "aa" был выше хотя бы рейтинга строки "bb aa cc".DEFINESCORE COMPLETION Score based on coverage. Documents will score higher if the ratio between the number of the matching terms and the number of all terms in the section (counting stop words) is higher. The COMPLETION scoring is only applicable when used with the WITHIN operator to search in zone sections .
...
Рейтинг: 0 / 0
19.08.2010, 14:25
    #36800244
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
-2-,

Спасибо. Я правильно понял, что contains в связке с WITHIN приводит к тому, что рейтинг считается выше, чем выше отношение числа найденных терминов к общему числу терминов в строке? Но для этого нужно создать раздел в текством индексе.
Раздел поиска я могу ведь просто задать общий на весь индекс. В реале там просто делить нечего.
...
Рейтинг: 0 / 0
19.08.2010, 14:45
    #36800334
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
КореецЯ правильно понял, что contains в связке с WITHIN приводит к тому, что рейтинг считается выше, чем выше отношение числа найденных терминов к общему числу терминов в строке?Я понял также, хотя definescore не пользовал. В качестве секций при построении индекса можно попробовать притянуть понятия "предложение", "параграф".
...
Рейтинг: 0 / 0
19.08.2010, 16:12
    #36800744
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
-2-,

DEFINESCORE появился только в Oracle 11. На нашей 10ке его нет. Жаль.

А "предложение", "параграф" работают следующим образом.

На примере SENTENCE - если у нас строки, которые проиндексированы оракл текстом, содержат точки(это считается разделителем предложений), то высший рейтинг получат те строки где в одном предложении встречаются все поисковые термины.

Например есть две строки вида
- IKS1. IKS2.
- IKS1 and IKS2.

при запросе
Код: plaintext
contains(field_txt,'(IKS and IKS2) WITHIN SENTENCE', 1 ) >  0 

высший рейтинг получит вторая строка.

Для нашей задачи это не подойдет.
...
Рейтинг: 0 / 0
20.08.2010, 19:02
    #36803714
flop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
GRY,
Код: plaintext
contains(text, 'aa-%',  1 ) >  0 
Кореец,
Код: plaintext
contains(text,'(AAA-%)*10, AAA, SYN(BBB, tes)', 1 ) >  0 
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
01.02.2017, 15:32
    #39396437
Avotge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
потыкался , но или не понял или не нашел.
Исх. данные:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE docs (f VARCHAR2(100));

INSERT INTO docs VALUES ('1.123 Mary had a little lamb');
INSERT INTO docs VALUES ('12.2.12 Twinkle, twinkle little star' );
INSERT INTO docs VALUES ('123.1 This Lamb is my lamb' );
INSERT INTO docs VALUES ('13.12.2 This Lamb is my lamb' );

CREATE INDEX docs_vc2doc_idx ON docs (f) INDEXTYPE IS ctxsys.context;


Необходимо, чтобы запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SQL> SELECT * FROM docs WHERE contains(f, '12.2', 1) > 0;
F
--------------------------------------------------------------------------------
12.2.12 Twinkle, twinkle little starSRC]
Не возвращал строку, то есть чтобы искалось четкое соответствие 12.2, а не вхождения.
Аналогично, при поиске
[SRC oracle]SQL> SELECT * FROM docs WHERE contains(f, '123', 2) > 0
  2  /
F
--------------------------------------------------------------------------------
1.123 Mary had a little lamb
123.1 This Lamb is my lamb 


Так же не должно ничего возвращаться.
То есть только когда есть четкое соответствие:
Код: plsql
1.
2.
3.
4.
5.
SQL> SELECT * FROM docs WHERE contains(f, '123.1', 2) > 0
  2  /
F
--------------------------------------------------------------------------------
123.1 This Lamb is my lamb


орацел 11.2
...
Рейтинг: 0 / 0
01.02.2017, 18:06
    #39396604
Не догнал
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
Avotge, а что такое по вашему "чёткое соответствие" ? Хотите искать слова что-ли?
...
Рейтинг: 0 / 0
02.02.2017, 10:17
    #39397015
Avotge
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
Не догнала что такое по вашему "чёткое соответствие" ? Хотите искать слова что-ли?
Верное уточнение, спасибо. То есть в поле содержатся слова (разделенные пробелом) в том числе и числа с точкой как в примере и надо находить именно целиком слова, не подхватывая вхождения внутри слов.
...
Рейтинг: 0 / 0
02.02.2017, 11:51
    #39397101
cone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Точный поиск с помощью Oracle Text (contains)
Avotge,

Надо поиграться с лексером и создавать индекс с этим лексером
Точно не помню, даю ключевые слова для дальнейшего поиска:
ctx_ddl.create_preference, ctx_ddl.set_attribute
BASIC_LEXER и его атрибуты numjoin, numgroup
ну и создание мндекса с параметрами
create index ... indextype is ctxsys.context parameters('lexer ...')
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Точный поиск с помощью Oracle Text (contains) / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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