:: Игры Разума
Оптимизация полнотекстового поиска
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Доброго вам понедельника.

Вводная:
есть список телефонных номеров (максимум три)
Есть таблица с полем phones,
в котором записаны так же телефонные номера разделённые пробелом
(то же не больше трех)

Задача:
Выбрать записи, в которых хотя бы один номер совпадает с номером из списка.

Решение очевидно: сформировать запрос типа
select * where ' 1234 '$(' '+phones+' ') or ' 5678 '$(' '+phones+' ')

Но таблица большая, запрос тормозит весьма.
Как его можно ускорить пользуясь, например, тем,
что номеров в поле небольше тёх, или что они фиксированных длинн (только 6 или 10 знаков)?

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

Да, тема тут, а не в основной ветке, т.к. таблица в mysql,
но, думаю, большинство идей на фоксе смогу реализовать и там.


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive
Re: Оптимизация полнотекстового поиска
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Построить соответствующие индексы через выражения/ф-ии, только я не знаю строит ли mysql такие индексы .

Типа:

CREATE CURSOR test (f1 c (11))
INSERT INTO test VALUES ('123 123 123')
INSERT INTO test VALUES ('456 456 456')
INSERT INTO test VALUES ('789 789 789')
INDEX ON LEFT(f1,3) TAG Lef
INDEX ON SUBSTR(f1, 5 , 3) tag midl
INDEX ON RIGHT(f1,3) TAG Rig
SYS(3054,11)
SELECT * FROM test WHERE RIGHT(f1,3) == '456' OR SUBSTR(f1, 5 , 3) == '123'


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 13.12.10 16:23
Ratings: 0 negative/0 positive
Re: Оптимизация полнотекстового поиска
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Ускорение основывается на уменьшении неопределенности того, что и где именно искать.

В данном случае неопределенность можно уменьшить только выделив номера телефонов из общей строки. Или хотя бы жетско ограничив позиции, где они могут находится. Например, первый номер - позиции с 1 по 10, второй номер - позиции с 12 по 21, третий номер - позиции с 23 по 32. Поиск по конкретным "координатам", как правило, выполняется быстрее.

Хотя, конечно, еще быстрее будет выделить отдельные номера в отдельную таблицу симулирующую полнотекстовый поиск. Ну, или хотя бы, если это возможно, построить индексы, по выражениям, содержащим отдельные номера. То, что в FoxPro возвращает GetWordNum()
Ratings: 0 negative/0 positive
Re: Оптимизация полнотекстового поиска
Goodwin
Автор

Сообщений: 3539
Откуда: Омск
Дата регистрации: 03.05.2006
Спасибо, для фокса рабочие варианты.
Но mysql по выражениям индексировать не умеет.
Значить буду поля плодить.


------------------
Что мы знаем о лисе?
Ничего. И то не все.
(С)Б. Заходер
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 3 (Гостей: 3)

© 2000-2024 Fox Club 
Яндекс.Метрика