天道酬勤,学无止境

FREETEXTTABLE的等级始终为0(FREETEXTTABLE always has a rank of 0)

问题

我正在使用SQLServer 2008,并且如果执行以下查询:

SELECT 
  *
FROM
  FREETEXTTABLE(SomeTable, Name, 'a name that I know exists')

我得到了我希望的行,但等级始终为0。

在寻找此问题的解决方案时,我在Microsoft ASP.NET论坛上找到了这个问题,并且确定添加以下内容是否足够:

ALTER FULLTEXT CATALOG MyCatalog REBUILD

我开始获得排名-但只是暂时的。

我不想每次搜索时都必须重建目录,特别是当数据库中有很多数据并且如果在查询之前将其直接添加到Sproc时,无论如何我的查询都不会返回任何结果,大概是因为目录已完成重建。 似乎还有其他人有这个问题和类似的问题,但是我一直找不到解决方案。 有任何想法吗?

回答1

排名是相对于查询中返回的其他结果而言的,因此仅对根据返回值进行相关性排序有用。 有有关排名方法的详细信息。

回答2

我在同一期中遇到问题,当前接受的答案对我来说不是解决方案。

是的,已经按照此答案进行了排名,但是自从上次目录重建以来已经有一段时间了,这绝对不是导致结果不一致的原因。 重建时排名应该不会有太大变化,重建后几分钟甚至更短的时间...

对我来说, freetexttable排名中有一个错误。 (不影响containstable排名的错误:我已经用我自己的越野车目录对其进行了检查,并且该问题也写在此Microsoft论坛帖子上。)

从另一个Microsoft论坛帖子看来,此错误仅发生在只有很少几行被索引的目录中。 将数据添加到目录会导致该错误消失。

因此,这是我的答案,摘自Pavel Valenta的另一篇Microsoft论坛帖子:

如果您的真实目录的索引行数不会超过几百行,请向目录中添加一些虚拟表,以使索引的行数更多。

由于查询的构建方式,因此不会污染您的结果。 是的,这似乎很奇怪。 但这是唯一为我解决了麻烦的人。

最后一点:我在sql 2005 sp4中遇到了这个问题,未在2008上进行过测试。(问题是针对2008年的。)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • FREETEXTTABLE always has a rank of 0
    I'm using SQLServer 2008 and if I perform the following query: SELECT * FROM FREETEXTTABLE(SomeTable, Name, 'a name that I know exists') I get the rows back that I would expect, but the rank is always 0. Searching for a solution to this problem, I found this question on the Microsoft ASP.NET forum, and sure enough if I add: ALTER FULLTEXT CATALOG MyCatalog REBUILD I start to get a rank - but only temporarily. I don't want to have to rebuild my catalog every time I do a search especially when I have lots of data in my database and if I add it to my Sproc directly before the query, my query
  • 使用FREETEXTTABLE为列赋予优先级/权重(Giving precedence/weight to a column using FREETEXTTABLE)
    问题 我正在使用带有关键字FREETEXTTABLE的SQL Server全文搜索,以基于几个列的形式返回结果表,以搜索关键字。 现在我正在搜索2个主要列,“标题”和“描述”,我想优先考虑“标题”列,因为这很可能会得到我的结果,但“描述”也可能也包含结果,但我希望它为单词中的词优先标题超过说明(但我不想使用CONTAINSTABLE,因为这太具体了)。 有没有一种方法可以使用FREETEXTTABLE赋予列权重/优先级? 回答1 您将需要使用带有联合的2个查询,以提供您自己的“权重”,如下所示: select [key], sum(rnk) as weightRank from ( select Rank * 2.0 as rnk, [key] from freetexttable(tableName,Title,'free text string') union all select Rank * 1.0 as rnk, [key] from freetexttable(tableName,Description,'free text string') ) as t group by [key]
  • Why or How does FREETEXTTABLE give a rank value higher than others
    There is a store procedure that uses FREETEXTTABLE twice on two tables and then merges the results and returns the top 50. The problem is if I do a search on "Women of Brewster", the results returns "Confession of an ex doofus motha" with a rank of 143 from table A and second "Women of Brewster Place" with a rank of 102 from table B. Is this because of the count? (Table A return results total is 2399. Table B return results total is 3445.)
  • How do I use full text search across multiple tables, SQL Server 2005
    I have a full text catalog with two tables in it. tableA has 4 columns (a1, a2, a3, a4) of wich 3 are indexed in the catalog, a2,a3,a4. a1 is the primary key. tableB has 3 columns (b1, b2, b3, b4), two of which are indexed in the catalog, b3 and b4. b1 is the PK of this table, b2 is the FK to tableA. I want to do something like SELECT *, (ftTableA.[RANK] + ftTableB.[RANK]) AS total_rank FROM tableA INNER JOIN tableB ON tableA.a1=tableB.b2 INNER JOIN FREETEXTTABLE(tableA, (a2,a3,a4), 'search term') as ftTableA ON tableA.a1=ftTableA.[KEY] INNER JOIN FREETEXTTABLE(tableB, (b3,b4), 'search term')
  • Giving precedence/weight to a column using FREETEXTTABLE
    I am using SQL Server Full Text Search, with the keyword FREETEXTTABLE to return a table of results based on a few columns, searching for a keyword. Now I have 2 main columns that I am searching on, Title and Description, I want to give precedence to the Title column as this will most likely have my results but Description might contain results too but I want it to give precedence for a word in Title over Description (but I don't want to use CONTAINSTABLE as this is too specific). Is there a way to give columns weights/precedence using FREETEXTTABLE?
  • 使用数量不确定的参数时,如何避免使用动态SQL?(How do I avoid dynamic SQL when using an undetermined number of parameters?)
    问题 我有一个正在使用的数据库的类似于StackOverflow的标记系统。 我正在编写一个存储过程,该存储过程基于WHERE子句中未确定数量的标签来寻找结果。 可能有0到10个标记之间的任意位置来过滤结果。 因此,例如,用户可能正在搜索带有“ apple”,“ orange”和“ banana”标签的商品,并且每个结果都必须包含所有3个标签。 我的查询变得更加复杂,因为我还在处理用于标记的交叉引用表,但是出于这个问题的目的,我将不再赘述。 我知道我可以进行一些字符串操作,并向exec()函数提供查询以解决此问题,但我宁愿不要解决与动态SQL相关的性能问题。 我认为最好是SQL为存储的proc缓存查询计划。 在这种情况下,您使用了哪些技术来避免动态SQL? 根据大众的需求,这是我正在使用的查询: SELECT ft.[RANK], s.shader_id, s.page_name, s.name, s.description, s.download_count, s.rating, s.price FROM shader s INNER JOIN FREETEXTTABLE(shader, *, @search_term) AS ft ON s.shader_id = ft.[KEY] WHERE EXISTS(SELECT tsx.shader_id FROM tag
  • 跨多个表的SQL Server全文查询-为什么这么慢?(SQL Server full text query across multiple tables - why so slow?)
    问题 我试图了解我正在构建的SQL Server 2008全文查询的性能。 使用全文索引的以下查询将立即返回正确的结果: SELECT O.ID, O.Name FROM dbo.EventOccurrence O WHERE FREETEXT(O.Name, 'query') 也就是说,所有EventOccurrences的名称中都带有单词“ query”。 使用来自不同表的全文索引的以下查询也将立即返回: SELECT V.ID, V.Name FROM dbo.Venue V WHERE FREETEXT(V.Name, 'query') IE。 名称中带有单词“ query”的所有场地。 但是,如果我尝试联接表并一次执行两个全文查询,则返回12秒: SELECT O.ID, O.Name FROM dbo.EventOccurrence O INNER JOIN dbo.Event E ON O.EventID = E.ID INNER JOIN dbo.Venue V ON E.VenueID = V.ID WHERE FREETEXT(E.Name, 'search') OR FREETEXT(V.Name, 'search') 这是执行计划:http://uploadpad.com/files/query.PNG 更新:计划以文本形式: |--Nested Loops
  • 实体框架6代码优先功能映射(Entity Framework 6 Code First function mapping)
    问题 我想将实体框架6集成到我们的系统中,但是有问题。 我想使用代码优先。 由于其他原因,我不想使用Database First * .edmx文件。 我使用属性映射[Table],[Column],这很好用数据库具有许多用户定义的函数,我需要在Linq To Entities查询中使用它们。 问题是: 我无法通过[Table],[Column]之类的属性映射功能。 [DbFunction]仅提供1个属性,该属性需要* .edmx文件。 我可以在* .edmx文件中具有功能映射,但是这意味着我不能为实体使用属性映射:[表],[列]。 映射必须在* .edmx或属性中完整。 我试图通过以下代码创建DbModel并添加函数: public static class Functions { [DbFunction("CodeFirstNamespace", "TestEntity")] public static string TestEntity() { throw new NotSupportedException(); } } public class MyContext : DbContext, IDataAccess { protected MyContext (string connectionString) : base(connectionString
  • SQL模糊匹配(SQL Fuzzy Matching)
    问题 希望我不再重复这个问题。 我在这里和谷歌做了一些搜索,然后再在这里发布。 我正在使用启用了全文本的SQL Server 2008R2运行eStore。 我的要求 有一个产品表,其中包含该产品适合的产品名称,OEM代码,型号。 所有内容均为文字。 我创建了一个名为TextSearch的新列。 这具有此产品适用的产品名称,OEM代码和型号的串联值。这些值以逗号分隔。 当客户输入关键字时,我们在TextSearch列上运行搜索以匹配产品。 请参阅下面的匹配逻辑。 我使用的是混合全文,通常喜欢进行搜索。 这给出了更相关的结果。 在临时表中执行的所有查询均返回。 匹配逻辑 运行以下SQL以使用全文获取相关产品。 但是@Keywords将被预处理。 说“ CLC 2200”将更改为“ CLC * AND 2200 *” 从dbo.product的位置选择ID(TextSearch,@ Keywords) 另一个查询将使用正常的赞运行。 因此,“ CLC 2200”将被预处理为“像%clc%这样的TextSearch和像%2200%这样的TextSearch”。 这仅仅是因为全文搜索不会在关键字之前搜索模式。 例如,它不会返回“ pclc 2200”。 从dbo.Product中选择ID,其中TextSearch如'%clc%'和TextSearch如'%2200%'
  • How do I avoid dynamic SQL when using an undetermined number of parameters?
    I have a StackOverflow-like tagging system for a database I'm working on. And I'm writing a stored procedure that looks for results based on an undetermined number of tags in a WHERE clause. There could be anywhere between 0 and 10 tags to filter results. So for example the user could be searching for items tagged with 'apple', 'orange', and 'banana' and each result must include all 3 tags. My query is made even more complicated because I'm also dealing with a cross reference table for the tagging, but for the purposes of this question I won't go into that. I know I can do some string
  • how to create and call scalar function in sql server 2008
    I have created a Scalar Functions, it was created successfully, but when I call the function using select statement, it says invalid object, I altered the function, I got the message command completed successfully, but when I call the function, I gets same error. below is the function I am trying to call: ALTER FUNCTION [dbo].[fn_HomePageSlider] ( @PortalID int, @ArticleID int ) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @HTML NVARCHAR(MAX) SET @HTML = ''; Declare @Title varchar(1000) Select @Title= Title from CrossArticle_Article c where c.Id=@ArticleID Select @HTML = @HTML + '<div class=
  • SQL Server 2005 Full-Text Search - can I search for forward-slash characters?
    I'm trying to use SQL Server 2005's Full-Text Search to find single forward-slash characters within my indexed column, without success. Can anyone tell me if this is possible at all? Example: In my CentralSearchCache table, the SearchData column contains a row with the text "This/string/contains/forward/slashes". This query: SELECT * FROM FREETEXTTABLE(CentralSearchCache, SearchData, 'forward/slashes') returns data, whereas this query: SELECT * FROM FREETEXTTABLE(CentralSearchCache, SearchData, '/') returns nothing. Is there any way of finding rows that contain one or more forward-slash
  • SQL Fuzzy Matching
    Hope i am not repeating this question. I did some search here and google before posting here. I am running a eStore with SQL Server 2008R2 with Full Text enabled. My requirements, There is a Product Table, which has product name, OEM Codes, Model which this product fits into. All are in text. I have created a new column called TextSearch. This has concatenated values of Product Name, OEM Code and Model which this product fits in. These values are comma separated. When a customer enters a keyword, we run search on TextSearch column to match for products. See matching logic below. I am using a
  • 将全文搜索与SQL Server结合起来有多难?(How hard is it to incorporate full text search with SQL Server?)
    问题 我正在构建一个带有SQL后端的C#/ ASP.NET应用程序。 我正按时完成工作,并完成了我的页面,在我的其中一个页面上,我的一位设计师在左侧区域加入了全文搜索。 到目前为止,我的“搜索”一直是过滤器,能够通过某些因素和列值来缩小结果集的范围。 由于我正按时完成任务(您知道一个晚上要睡3个小时,那时候我看上去就像猫吃了东西就扔了一样),所以我希望此页面与其他页面非常相似,因此我正在尝试决定是否发臭。 我以前从未在页面上进行过全文搜索....这是要爬的山还是有简单的解决方案? 谢谢你。 回答1 首先,您需要在生产服务器上启用“全文本搜索”索引,因此,如果这不在范围之内,那么您就不希望这样做。 但是,如果已经准备好了,则全文搜索相对简单。 T-SQL有4个用于全文搜索的谓词: 自由文本自由文本表内含物可容纳 FREETEXT是最简单的,可以这样完成: SELECT UserName FROM Tbl_Users WHERE FREETEXT (UserName, 'bob' ) Results: JimBob Little Bobby Tables FREETEXTTABLE的功能与FreeTEXT相同,不同之处在于它以表形式返回结果。 T-SQL全文搜索的真正功能来自CONTAINS(和CONTAINSTABLE)谓词...这是一个很大的谓词,因此我将其用法粘贴到:
  • 检查字符串是否为SQL Server保留关键字(Check if string is SQL Server Reserved Keywords or not)
    问题 是否可以确定是否有任何字符串是SQL Server保留关键字? 逻辑应该- IF @string is SQL Server Reserved Keywords RETURN 1 ELSE RETURN 0 回答1 据我所知,没有内置的方法。 您可以编写自己的函数,该函数会将字符串与文档中已知的保留字进行比较。 该列表可以在表中保持动态,以便在表更改时(例如,对于SQL Server的不同版本)可以更新表。 同样,单个SELECT语句也将产生结果。 回答2 您可以制作一个包含关键字的表。 可以在这里找到列表:http://msdn.microsoft.com/en-us/library/ms189822.aspx 然后,您可以在位置使用联接来确定是否保留字符串。 回答3 这是SQL Server 2000的功能:http://www.novicksoftware.com/udfofweek/Vol2/T-SQL-UDF-Vol-2-Num-29-udf_SQL2K_IsKeywordBIT.htm 这是SQL-Server 2012中的关键字:http://technet.microsoft.com/zh-cn/library/ms189822.aspx 因此,将缺少的关键字添加到此函数中: CREATE FUNCTION dbo.udf_isKeywordBIT (
  • 生成所有5张纸牌扑克手(Generating all 5 card poker hands)
    问题 乍看之下,这个问题听起来很简单,但事实却比看起来复杂得多。 现在让我感到难过。 有52c5 = 2,598,960种方法可从52张卡片组中选择5张卡片。 但是,由于花色在扑克中是可以互换的,因此其中许多花色是等效的-手2H 2C 3H 3S 4D等效于2D 2S 3D 3C 4H-只需换一下花色即可。 根据维基百科的说法,一旦您考虑了可能的西装重新着色,就会有134,459张不同的5张牌。 问题是,我们如何有效地产生所有这些可能的手? 我不想产生所有手牌,然后消除重复,因为我想将此问题应用于更多的牌,并且手牌数量过多以评估失控的快速盘旋。 我目前的尝试集中在以下方面:要么先生成深度优先,然后跟踪当前生成的卡,以确定对下一张卡有效的西服和等级,要么广度优先,生成所有可能的下一张卡,然后通过转换每张卡来消除重复通过重新着色将其移至“规范”版本。 这是我在Python中尝试广度优先的解决方案的尝试: # A card is represented by an integer. The low 2 bits represent the suit, while # the remainder represent the rank. suits = 'CDHS' ranks = '23456789TJQKA' def make_canonical(hand): suit_map =
  • R中的等级和顺序(rank and order in R)
    问题 我在理解R函数rank和R函数order之间的区别时遇到了麻烦。 他们似乎产生相同的输出: > rank(c(10,30,20,50,40)) [1] 1 3 2 5 4 > order(c(10,30,20,50,40)) [1] 1 3 2 5 4 有人可以帮我一下吗? 谢谢 回答1 > set.seed(1) > x <- sample(1:50, 30) > x [1] 14 19 28 43 10 41 42 29 27 3 9 7 44 15 48 18 25 33 13 34 47 39 49 4 30 46 1 40 20 8 > rank(x) [1] 9 12 16 25 7 23 24 17 15 2 6 4 26 10 29 11 14 19 8 20 28 21 30 3 18 27 1 22 13 5 > order(x) [1] 27 10 24 12 30 11 5 19 1 14 16 2 29 17 9 3 8 25 18 20 22 28 6 7 4 13 26 21 15 23 rank返回一个带有每个值“等级”的向量。 在第一个位置的数字是第9个最低的数字。 order返回将初始向量x排序的索引。 x的第27个值是最低的,因此27是order(x)的第一个元素-如果您看一下rank(x) ,则第27个元素是1 。 > x[order
  • MPI死锁(Deadlock with MPI)
    问题 我正在尝试MPI,想知道这段代码是否会导致死锁。 MPI_Comm_rank (comm, &my_rank); if (my_rank == 0) { MPI_Send (sendbuf, count, MPI_INT, 1, tag, comm); MPI_Recv (recvbuf, count, MPI_INT, 1, tag, comm, &status); } else if (my_rank == 1) { MPI_Send (sendbuf, count, MPI_INT, 0, tag, comm); MPI_Recv (recvbuf, count, MPI_INT, 0, tag, comm, &status); } 回答1 MPI_Send可能会阻塞也可能不会阻塞。 它将阻塞,直到发送方可以重用发送方缓冲区为止。 当缓冲区已发送到较低的通信层时,某些实现将返回给调用方。 当另一端有匹配的MPI_Recv()时,其他一些将返回到调用方。 因此,此程序是否会死锁取决于您的MPI实现。 由于该程序在不同的MPI实现之间的行为有所不同,因此您可以考虑重新编写它,以免出现死锁: MPI_Comm_rank (comm, &my_rank); if (my_rank == 0) { MPI_Send (sendbuf, count, MPI_INT, 1, tag
  • 在fortran中具有未知等级(形状)的子例程参数(subroutine argument with unknown rank (shape) in fortran)
    问题 我想知道如何在Fortran中最好地处理带有未知等级参数的子例程。 例如: Real * 8 :: array1(2,2),array2(2,2,3) call mysubroutine(array1) call mysubroutine(array2) 到目前为止,我始终需要在子例程中固定形状(等级数)。 例如,内在子例程random_number ( array )可以做到。 (但也许它不是在Fortran中编码的?) 回答1 您必须为每个数组等级编写一个特定的子例程,但是您需要创建一个通用接口,以便可以对所有等级使用通用调用,而不必找出要调用的特定子例程。 有关如何为“分配”编写包装的示例代码 回答2 如果需要按元素填充数组,并且这些操作彼此独立,则可以考虑使用MSB来建议使用elemental函数。 在这种情况下,您将为标量(一个元素)编写函数,并且该函数将自动应用于数组的所有元素,而与数组的形状无关。 但是,您的标量函数必须满足elemental例程上的条件,这基本上意味着不允许产生任何副作用,这将使您的结果取决于将其应用于单个数组元素的顺序。 在演示下面,该演示将数组的每个元素乘以2: module testmod implicit none integer, parameter :: dp = kind(1.0d0) contains elemental
  • 对数组元素进行排名(Ranking array elements)
    问题 我需要一种在Javascript中对数组元素进行排名的算法。 例子:我有一个数组如下: [79, 5, 18, 5, 32, 1, 16, 1, 82, 13] 我需要按值对条目进行排名。 所以82应接收秩1 , 79秩2等。如果两个项有相同的值,他们收到相同的秩和用于较低的值的等级上升。 因此,对于此数组,新的排名数组将为: [2, 7, 4, 7, 3, 9, 5, 9, 1, 6] 我怎样才能做到这一点? 回答1 var arr = [79, 5, 18, 5, 32, 1, 16, 1, 82, 13]; var sorted = arr.slice().sort(function(a,b){return ba}) var ranks = arr.map(function(v){ return sorted.indexOf(v)+1 }); console.log(ranks); 结果 : [2, 7, 4, 7, 3, 9, 5, 9, 1, 6] 如果你想用旧的浏览器兼容,你可能需要定义一个垫片对的indexOf和地图(注意,如果你要做到这一点非常快非常大的数组,你最好使用for循环和使用对象map而不是indexOf )。 回答2 这不适用于较旧的浏览器,因为它使用ECMAScript 5功能,但即使是非常大的数组,它也可以让您快速而简洁地产生一组排名。