Оператор AND для нескольких столбцов в полнотекстовом индексе - PullRequest
2 голосов
/ 11 февраля 2010

У меня есть полнотекстовая индексированная таблица, и я пытаюсь запросить результаты, соответствующие нескольким словам. Например. У меня есть таблица адресов с индексированными столбцами 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

Но он вообще не вернет никаких строк.

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

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

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

0 голосов
/ 07 апреля 2011

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

Определение индексированного представления для таблицы, где один столбец является первичным ключом, второй - объединение всех других интересующих столбцов, затем полнотекстовый индекс в представлении. Поиск выполняется в представлении с одинаковым синтаксисом «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
)

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

0 голосов
/ 26 ноября 2010

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

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