0

我在我的网站上使用自由文本来获得更好的搜索结果,但得到了一些我不明白的东西。

如果我使用它作为我的自由文本搜索(使用containtstable()

isabout("*redflower*" weight (.3), "*red*" weight (.2), flower weight (.1))

我获得Red Mason Bee Box了 172 的排名,也获得Wildflower Seeds - Red Campion了 172 的排名。这个描述是唯一被搜索的字段。我会认为Wildflower Seeds - Red Campion应该排名更高,因为它包含两个术语而不仅仅是一个。

有人可以解释正在发生的事情,并可能提供一些如何调整它的例子,以便它在所有单词的描述中排名更高吗?

编辑:我也试过:

isabout("*redflower*", "*red*" weight (.2), "*flower*" weight (.1))

这将结果更改为Red Mason Bee Box排名为 21 和Wildflower Seeds - Red Campion排名为 21。我不明白为什么会发生这种情况,因为第二个单词包含两个单词,而不仅仅是一个。

4

2 回答 2

1

在执行此加权搜索之前,我将更改搜索方式以使用 NEAR 运算符。这应该首先带回最相关的结果。

'flower NEAR red'- 这在我的示例中实际上不起作用,因为您不能使用前导通配符,但我将创建我所有字段的反向索引,并且这样做"rewolf*" NEAR der'将转化为Wildflower NEAR red

于 2012-03-06T10:29:39.187 回答
1

首先,您在语法中的意图似乎是定义一个后缀词(“*flower”)来调整排名 - 我相信 SQL Server 2008 全文搜索引擎的性质只支持前缀(“wild*”会修改排行)。但我看你已经意识到了这一点。

其次,断词器不会将“野花”分成两个词。有一个方便的表值函数,可让您查看引擎在应用其分词器和词干分析器时正在执行的操作 - sys.dm_fts_parser

select * from sys.dm_fts_parser('"Wildflower Seeds - Red Campion"', 1033, null, 0)


group_id    phrase_id   occurrence  special_term     display_term    expansion_type source_term
----------- ----------- ----------- ---------------- --------------- -------------- --------------------------------
1           0           1           Exact Match      wildflower      0              Wildflower Seeds - Red Campion
1           0           2           Exact Match      seeds           0              Wildflower Seeds - Red Campion
1           0           3           Exact Match      red             0              Wildflower Seeds - Red Campion
1           0           4           Exact Match      campion         0              Wildflower Seeds - Red Campion

另一种解决方案是手动定义从 Flower 到 Wildflower的词库扩展:

<expansion>
     <sub>flower</sub>
     <sub>wildflower</sub>
</expansion>

但这仅适用于这种特定情况。

于 2012-03-06T10:43:43.290 回答