我有一个全文索引表,并尝试查询匹配多个单词的结果。例如。我有一个包含索引列address_text
,zip_code
和city
的地址表。
| ROW | address_text | zip_code | city |
| 1 | Bourbon street | 1234 | Baltimore |
| 2 | Bourbon street | 1234 | New Orleans|
现在我想搜索“Bourbon Baltimore”并且只想要第一行。
我尝试了以下内容:
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
但它根本不会返回任何行。
答案 0 :(得分:1)
我发现这是一个有趣的问题所以我决定去阅读“CONTAINSTABLE”。所以,我看到它是一个Transact SQL函数。如果我正确阅读文档,看起来 contains_search_condition (即'“波旁威士忌*”和“巴尔的摩*”)将分别应用于每列 。因此,您可能需要将两个CONTAINSTABLE函数连接在一起才能获得所需的效果。
每个CONTAINSTABLE都需要指定一个搜索条件,除非您想在每个列中搜索每个搜索条件。在这种情况下,AND需要成为OR。
答案 1 :(得分:0)
在我看来,FREETEXT命令可能是您最简单的选项,如果需要,可能与CONTAINSTABLE一起使用。
SELECT *
FROM ADDRESSES
WHERE FREETEXT (*, 'Bourbon Baltimore' ) --no wildcards possible
答案 2 :(得分: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
)
然后是视图上的全文索引