2010-02-11 1 views
2

У меня есть таблица с полным текстом индексирования и пытаюсь запросить результаты, соответствующие нескольким словам. Например. У меня есть таблица адресов с индексированными столбцами address_text, zip_code и city.И инструкция для нескольких столбцов в полнотекстовом индексе

| ROW | address_text | zip_code | city  | 
| 1 | Bourbon street | 1234  | Baltimore | 
| 2 | Bourbon street | 1234  | New Orleans| 

Теперь я хочу найти «Бурбон Балтимор» и хочет только первую строку.

Я попытался следующие:

SELECT FT_TBL.* FROM ADDRESSES AS FT_TBL 
INNER JOIN CONTAINSTABLE(ADDRESSES, *, '"Bourbon*" AND "Baltimore*"') AS KEY_TBL 
ON FT_TBL.address_id = KEY_TBL.[KEY] 
ORDER BY KEY_TBL.RANK, address_text 

Но он не возвращает ни одной строки на всех.

ответ

1

Я нашел этот интересный вопрос, поэтому решил пойти и прочитать «СОДЕРЖАНИЕ». Итак, я вижу, что это функция Transact SQL. Если я правильно читаю документацию, это выглядит как contains_search_condition (т. Е. «Бурбон *» и «Балтимор *») применяется к каждому столбцу отдельно. Таким образом, вам, вероятно, потребуется объединить две функции CONTAINSTABLE, чтобы получить желаемый эффект.

Каждому CONTAINSTABLE необходимо указать одно из условий поиска, если вы не хотите искать каждый из них в каждом столбце. В этом случае И должен стать OR.

0

Мне кажется, что команда FREETEXT может быть вашим самым простым вариантом, возможно, использоваться вместе с CONTAINSTABLE, если необходимо.

SELECT * 
FROM ADDRESSES 
WHERE FREETEXT (*, 'Bourbon Baltimore') --no wildcards possible 
0

Возможно, я слишком поздно, но у меня такая же проблема. Хлопое и уродливое решение, с которым я пришел, - это следующее.

Определите индексированный вид по таблице, при этом один столбец является первичным ключом, второй - конкатенацией всех других столбцов, представляющих интерес, а затем полный текст в представлении. Поиски выполняются на представлении с тем же синтаксисом «„TERM1“и„term2“»

так что в этом случае было бы

CREATE VIEW vFoo 
WITH SCHEMABINDING 
AS 
SELECT ROW, ISNULL(address_text,'') + ' ' 
+ ISNULL(cast(zip_code as varchar(xx)),'') + '' as SearchText 
FROM addresses 

CREATE UNIQUE CLUSTERED INDEX uci_bar ON vFoo 
(
    Row ASC 
) 

, а затем полнотекстовый индекс на представлении