【问题标题】:Full Text Search with LINQ, decrease results with each keyword使用 LINQ 进行全文搜索,减少每个关键字的结果
【发布时间】:2012-04-27 21:44:08
【问题描述】:

我按照this SO question 中的说明创建了一个 linq 函数来对我拥有的食物数据库进行全文搜索。该数据库中有超过 7000 条记录,我添加每个关键字后,结果会变得更大而不是更小。

这是我的功能的核心:

SELECT *
FROM USDA_Foods AS FT_TBL 
    INNER JOIN FREETEXTTABLE(USDA_Foods,
    Shrt_Desc, 
    @searchWord) AS KEY_TBL
ON FT_TBL.foodId = KEY_TBL.[KEY]

如何通过更改上面的代码来减少每个新关键字的结果?

谢谢

【问题讨论】:

    标签: c# asp.net sql-server linq-to-sql


    【解决方案1】:

    您会得到更多结果,因为它可以在搜索列中查找任何单词,而不是像您期望的那样包含所有单词。您不能在 FREETEXTTABLE 中使用 AND 或任何内容,因此您必须使用 CONTAINSTABLE 之类的内容,它允许您在提供的单词之间使用 AND。

    CONTAINSTABLE (Transact-SQL)

    在此处查看示例“I. 使用带有逻辑运算符 (AND) 的 CONTAINS”:

    CONTAINS (Transact-SQL)

    该语法对 CONTAINSTABLE 也有效。

    SELECT *
    FROM USDA_Foods AS FT_TBL 
        INNER JOIN CONTAINSTABLE(USDA_Foods,
        Shrt_Desc, 
        @searchWord) AS KEY_TBL
    ON FT_TBL.foodId = KEY_TBL.[KEY]
    

    你的@searchWord 应该是这样的

    'here AND there AND everywhere'
    

    查找包含此处、那里和任何地方的文本。

    【讨论】:

    • 我认为我需要 AND,但我选择的 FREETEXTTABLE 似乎让我受益匪浅。如果我想为用户插入 AND 而不是他们输入它,最好在我的代码后面或 sql 函数中添加AND(如果可能的话)
    • 在你的代码后面要容易得多。只需将空格“”替换为“AND”即可。您还应该修剪字符串的开头和结尾,并在“最终替换”之前一起替换多个空格。您还可以使用 Split,该选项可以省略空字符串,并组成您的“ANDed”kwywords 字符串。在 T-SQL 中执行此操作要困难得多。
    【解决方案2】:

    为每个搜索词连接 INNER JOINS。

    SELECT * 
    FROM USDA_Foods AS FT_TBL 
        INNER JOIN FREETEXTTABLE(USDA_Foods,
        Shrt_Desc, 
        @searchWord1) AS KEY_TBL1
    ON FT_TBL.foodId = KEY_TBL1.[KEY]
        INNER JOIN FREETEXTTABLE(USDA_Foods,
        Shrt_Desc, 
        @searchWord2) AS KEY_TBL2
    ON FT_TBL.foodId = KEY_TBL2.[KEY]
    

    【讨论】:

    • 这假设运行严重的查询......如果有很多几个搜索词,它会变得非常慢。最好使用 containstable 和“AND”操作符在单个查询中获取结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多