4

我有一个表hotel,其中包含以下信息:

  • Hotel_Id: 2950
  • Hotel_Name: 公园旅馆
  • Hotel_Number: 01234567
  • Hotel_TypeId: 1

我需要能够搜索名称列包含某些术语的记录。

搜索是:

select * 
from ContainsTable(hotel, Hotel_Name, '"Inn on Park"')

我没有得到任何结果,但如果我搜索:

select * 
from ContainsTable(hotel, Hotel_Name, '"In on Park"')

我明白了

Key: 2950
Rank: 176

我认为“旅馆”一词存在一些问题,但如果我搜索:

select * 
from ContainsTable(hotel, Hotel_Name, '"Inn"')

我得到相同的密钥:2950,排名:176 结果。

“inn”是导致此问题的关键字吗?

4

1 回答 1

4

这是我的理论。。

您的酒店名称 ,Inn on the Park将是这样的索引:

pos   word
1     Inn
2     (noise)
3     (noise)
4     Park

onthe是停止/噪音词,而不是存储在索引中(但请注意,位置仍然存储)。

您正在搜索一个完整的字符串。考虑到噪音词,这意味着:

Query 1: "Inn on Park" -> "Inn (noise) Park"
Query 2: "In on Park" -> "(noise) (noise) Park"

您的索引字符串(酒店名称)是Inn (noise) (noise) Park,因此这将是第二个查询的部分匹配,但第一个查询不匹配。

这可以通过例如搜索来测试Inn 1 1 Park。这将返回一个结果。But Inn 1 Parkor 1 Inn 1 Parkwill not (职位不对应)。

要“解决”这个问题,您可以使用不同的运算符,例如 AND、OR 或 NEAR:

"Inn" AND "Park"
"Inn*"
"Inn" NEAR "Park" 

这是两个屏幕截图,显示了主要查询的结果。注意第二个如何只搜索“ Park ”或“ noise noise Park ”(其中任何一个都会返回结果):

在此处输入图像描述

在此处输入图像描述

于 2015-05-11T10:36:36.730 回答