【问题标题】:Sql Server multiple word search and ranking the resultsSql Server 多词搜索和排序结果
【发布时间】:2012-01-24 13:16:47
【问题描述】:

假设用户输入“Vintage Audi Car”作为搜索条件

我的表有一个字段“描述”作为 Varchar(Max)

我想搜索用户输入的值,如 Vintage OR Audi OR Car。结果应在顶部显示包含“描述”中所有三个单词的行,以及包含任意两个单词的行,然后显示包含任意一个单词的行。

让我知道如何实现。

我愿意使用全文搜索。

【问题讨论】:

  • 不熟悉 FTS,你真的有多个查询联合在一起(不是ALLed)。我假设使用 FTS,您可以编写 3 个查询,vintage AND audi AND car,然后是 vintage AND audi + vintage AND car ... 然后是 vintage OR audi or car
  • 这会显着降低查询的性能。另外我不能假设搜索条件中总是只有三个词

标签: sql-server full-text-search


【解决方案1】:

这应该可以使用带有命令 CONTAINSTABLE 的全文搜索:

SELECT * FROM Car 
INNER JOIN CONTAINSTABLE(Car, Description, 'ISABOUT (Vintage weight (.5), Audi weight (0.5), Car weight (0.5) )') AS A 
   ON Car.Id = A.[KEY] 
ORDER BY A.[RANK] DESC;

排名是根据权重计算的,所以描述为“Vintage Audi”的行将获得比描述为“Audi”的行更高的排名。

【讨论】:

    【解决方案2】:

    这是使用LIKE 运算符实现此结果的一种方法:

    select Description
    from MyTable
    where Description like '%Vintage%' OR Description like '%Audi%' OR Description like '%Car%'
    order by (case when Description like '%Vintage%' then 1 else 0 end
    + case when Description like '%Audi%' then 1 else 0 end
    + case when Description like '%Car%' then 1 else 0 end) DESC
    

    WHERE 子句将结果限制为至少包含一个单词的描述(因此是OR)。 ORDER BY 为列表中的每个单词添加1,将得分较高的项目带到顶部。

    【讨论】:

    • 虽然我还没有尝试过,但是我怀疑这个查询是否会将任何两个单词的记录作为第二优先发布。
    • 嗯,您的查询为我提供了提示,也许我能够解决我的问题。会及时通知您。
    【解决方案3】:

    即使我有同样的问题,我也使用 MYISAM 引擎解决了它

    改变桌子汽车

    ALTER TABLE  Car ENGINE = MYISAM;
    

    然后

    select * FROM Car WHERE MATCH (Description) AGAINST ('Vintage Audi Car'  IN BOOLEAN MODE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2011-05-23
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      相关资源
      最近更新 更多