Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
Прошу совета по модели поиска. Товар(предположим) характеризуется кодом, названием, описанием и вхождением в группы (у групп тоже есть название). Поисковая строка может содержать числовые коды товаров (ищем по полному совпадению) и слова (FTS ). Результаты поиска хотелось бы вывести в таком порядке: - товары, найденные по числовым кодам, отсортированы в порядке перечисления в строке - товары, найденые по ключевым словам (FTS по нескольким таблицам) Оставим пока за скобками релевантность результатов для поиска по описанию и вхождению в несколько групп. рассмотрим такой метод: - строка поиска разбирается на фрагменты - фрагменты типизируются на "коды" и "слова" - первый поиск делаем по ~ "код1" or ~ "код2", сохраняем id найденных во врем. таблицу - из "слов" формируем tsquery ' слово1 | слово2 ..' - делаем второй поиск по tsquery @@ tsvector(индексированные поля), тоже сохраняем id во врем. таблице Скорость отдельного FTS поиска по одной таблице(~50K записей)~10-30 мс. Но есть подозрение, что для большого числа паттернов в tsquery и объединений по 4-5 таблицам все будет не так радостно. Как вообще принято решать такие задачи при бОльшем числе таблиц для поиска? Хранение tsvector для всех искомых полей в отдельной таблице или что-то еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 12:50 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
Я занимаюсь поиском в базе геоданных, объединяя таблицы с помощью inner join'ов, можно ещё было бы делать через union, intersect и т.п., но сопоставление по скорости поиска было в пользу джойнов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 13:00 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
Само собой разумеется, что критерии поиска уже распатронены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 13:02 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
Для меня inner join - не выход. Если, к примеру, какой то товар не входит ни в одну группу, он все равно должен быть найден по своему названию. Т.е. везде вылезают left outer join. Не забудем и про большое кол-во OR в условии.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 13:06 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
OR ИМХО лучше переделывать в left join, иными словами я сначала в хранимой процедуре формирую запрос, исходя из наличия/отсутствия критериев, а потом его выполняю, и в джойн одна и та же таблица может входить неоднократно под различными алиасами, поэтому товар не входящий в группу можно найти по названию, запихав в джойн таблицу с товарами как-то так Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 13:16 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
Стоит попробовать всё запихать в один tsvector. Для смешанных буквенно-цифровых кодов вроде бы все ОК, стемминг их не исковеркает. Вынесение поиска по коду наверх делается элементарно через ts_rank - нужно лишь при заполнении вектора дать кодам большой вес A, а описаниям - самый маленький D. Названия группы правда не придумаю куда сунуть, наверно всё же отдельно искать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 13:27 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
YuriyRusinov запихав в джойн таблицу с товарами как-то так Код: plaintext Не уверен, что понял. Положим ключевых слов 10, а таблиц 5. Каждое слово может быть найдено в любой из таблиц. Что же будет с количеством inner join - 50 штук? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 14:13 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
планировщик с таким не справится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 14:13 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
tadminПрошу совета по модели поиска. Товар(предположим) характеризуется кодом, названием, описанием и вхождением в группы (у групп тоже есть название). Поисковая строка может содержать числовые коды товаров (ищем по полному совпадению) и слова (FTS ). Результаты поиска хотелось бы вывести в таком порядке: - товары, найденные по числовым кодам, отсортированы в порядке перечисления в строке - товары, найденые по ключевым словам (FTS по нескольким таблицам) Оставим пока за скобками релевантность результатов для поиска по описанию и вхождению в несколько групп. рассмотрим такой метод: - строка поиска разбирается на фрагменты - фрагменты типизируются на "коды" и "слова" - первый поиск делаем по ~ "код1" or ~ "код2", сохраняем id найденных во врем. таблицу - из "слов" формируем tsquery ' слово1 | слово2 ..' - делаем второй поиск по tsquery @@ tsvector(индексированные поля), тоже сохраняем id во врем. таблице Скорость отдельного FTS поиска по одной таблице(~50K записей)~10-30 мс. Но есть подозрение, что для большого числа паттернов в tsquery и объединений по 4-5 таблицам все будет не так радостно. Как вообще принято решать такие задачи при бОльшем числе таблиц для поиска? Хранение tsvector для всех искомых полей в отдельной таблице или что-то еще? tsvector позволяет хранить 4 поля (A,B,C,D), которые можно указывать при запросе, например, ищем слово 'лопата' в полях A и C [src]to_tsquery('лопата:ac') @@ fts/SRC] Таким образом, один tsvector может обеспечить довольно большое количество разных поисков. этим же полям в ранжирующей функции можно приписать разный вес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 14:17 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
Слово ищется не в таблице, а в поле таблицы, соотвественно таблицы джойнятся по ключам и добавляются условия типа word1 in (myau-myau-myau) or word2 in (gav-gav-gav) etc. т.е. число left или inner join получится в зависимости только от числа таблиц, в которых осуществляется поиск. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 14:48 |
|
||
|
модель поиска
|
|||
|---|---|---|---|
|
#18+
Спасибо, Олег. Код: plaintext 1. 2. 3. 4. 5. 6. 7. __ OR используется, потому что при конкатенации tsvector индекс не будет использован. Для одной таблицы можно сделать составной индекс, но это только пример. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.07.2008, 15:12 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=35403874&tid=2004253]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
34ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 320ms |

| 0 / 0 |
