Полнотекстовый поиск в нескольких таблицах

Я пытаюсь сделать подробный поиск с помощью asp и SQL Server Full-text.

Когда ключевое слово отправлено, мне нужно выполнить поиск в нескольких таблицах. Например,

Таблица – Участники

  • member_id
  • contact_name

Таблица – Образование

  • member_id
  • school_name

Мой запрос;

select mem.member_id, mem.contact_name, edu.member_id, edu.school_name from Members mem FULL OUTER JOIN Education edu on edu.member_id=mem.member_id where CONTAINS (mem.contact_name, '""*"&keyword&"*""') or CONTAINS (edu.school_name, '""*"&keyword&"*""') order by mem.member_id desc;

Этот запрос работает, но его выполнение занимает очень много времени.

Представьте, что ключевое слово — Фил; Если соответствует mem.contact_name, перечислите его, а если edu.school_name matches, укажите тех, чье образование соответствует ключевому слову.

Надеюсь, я смог хорошо объяснить :) Извините за мой английский.


person Burak F. Kilicaslan    schedule 21.12.2009    source источник
comment
Кстати, я не могу использовать Union, потому что поля членов и образования не совпадают. Мне нужно искать также в contact_address в таблице Members.   -  person Burak F. Kilicaslan    schedule 21.12.2009
comment
Ответы на этот вопрос могут оказаться полезными: stackoverflow.com/questions/2063561/ .   -  person Vince Bowdren    schedule 21.01.2010


Ответы (3)


Пара моментов, я не понимаю, что повлияет на вашу скорость.

  1. Вам действительно нужно полное внешнее соединение? Это убивает тебя. Похоже, эти таблицы один в один. В этом случае вы не можете сделать это внутренним соединением?
  2. Не можете ли вы передать список столбцов, чтобы он содержал вот так:

    SELECT mem.member_id,
         mem.contact_name,
         edu.member_id,
         edu.school_name
    FROM members mem
        INNER JOIN education edu ON edu.member_id = mem.member_id
    WHERE Contains((mem.contact_name,edu.school_name),'*keyword*')
    ORDER BY mem.member_id DESC 
    

Дополнительная информация о содержит.

person jimconstable    schedule 21.12.2009
comment
Sql Server не может сопоставлять префиксы, поэтому полезно только ключевое слово*. Также: Msg 7646, Level 16, State 1, Line 7 Fulltext predicate references columns from two different tables or indexed views 'mem' and 'edu' which is not allowed. - person Amit Naidu; 14.09.2013

Возможно, попробуйте индексированное представление, содержащее объединенный набор данных — вы можете добавить туда полнотекстовый индекс вместо отдельных таблиц, и в дальнейшем его можно расширить до такого количества таблиц, сколько вам нужно. Единственная хитрость, конечно, это пространство...

person nitzmahone    schedule 22.12.2009

Это то, что я бы сделал для полнотекстового поиска по нескольким таблицам.

Не точно, но это даст основную идею. главное, чтобы табличные тиски содержались с условием ИЛИ.

DECLARE  @SearchTerm NVARCHAR(250)
    
SET @SearchTerm = '"Texas*"'

SELECT * FROM table1 
JOIN table2 on table1.Id = table2.FKID
WHERE (
        (@SearchTerm = '""') OR 
        CONTAINS((table1.column1, table1.column2, table1.column3), @SearchTerm) OR 
        CONTAINS((table2.column1, table2.column2), @SearchTerm)
      )
person Bharat    schedule 26.11.2020