sql server CONTAINS用法??

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql server CONTAINS用法??相关的知识,希望对你有一定的参考价值。

sql server中 搜索的是中文的时候 CONTAINS的用法? 双引号在使用时和不使用有什么区别?
中文的话会支持分词吗? 比如查询的的是 '我是谁' 这里没用到双引号 会分为 ‘我’ ‘是’ ‘谁’ 分别查找吗?

CONTAINS是用来实现全文检索的,对于中文好像还不支持分词处理
双引号使用的话是用来表示词组,如果不用双引号,会将引号中的单词给进行分词处理,这样就不连续了。
1. 查询住址在北京的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, 'beijing' )
remark: beijing是一个单词,要用单引号括起来。
2. 查询住址在河北省的学生
SELECT student_id,student_name
FROM students
WHERE CONTAINS( address, '"HEIBEI province"' )
remark: HEBEI province是一个词组,在单引号里还要用双引号括起来。追问

中文的话会支持分词吗? 比如查询的的是 '我是谁' 这里没用到双引号 会分为 ‘我’ ‘是’ ‘谁’ 分别查找吗?

追答

支持中文分词,但是分的效果很差,只有在其字典中的词才会被建立索引,而且经常出错,想你举的例子估计不会被创建成索引项,因为会被作为停用词过滤掉,现在SQLSERVER的中文分词一直被大家抱怨

参考技术A CONTAINS的意思是包含,通常用在条件查询中。
sql:select id,name from tablename where contains( address, '上海' );
解释:查询出tablename表中address字段的值包含“上海”的所有记录的id和name字段的值。
备注:通常contains语句可以通过like语句来进行替换。在实际开发中可以根据实际情况选择一种即可。

将 SQL Server 的 CONTAINS() 作为模型定义函数导入

【中文标题】将 SQL Server 的 CONTAINS() 作为模型定义函数导入【英文标题】:Importing SQL Server's CONTAINS() as a model defined function 【发布时间】:2012-02-19 10:13:46 【问题描述】:

我正在尝试在我的实体框架模型中导入 SQL Server 的 CONTAINS() 函数,以便我可以在我的 LINQ 查询中使用它。

我已将此添加到我的 EDM 中:

<Function Name="FullTextSearch" ReturnType="Edm.Boolean">
    <Parameter Name="Filter" Type="Edm.String" />
    <DefiningExpression>
        CONTAINS(*, Filter)
    </DefiningExpression>
</Function>

添加创建我的方法存根:

[EdmFunction("MyModelNamespace", "FullTextSearch")]
public static bool FullTextSearch(string filter)

    throw new NotSupportedException("This function is only for L2E query.");

我尝试这样调用函数:

from product in Products
where MyModel.FullTextSearch("FORMSOF(INFLECTIONAL, robe)")
select product

引发以下异常:

The query syntax is not valid. Near term '*'

我意识到我定义的函数没有直接链接到被查询的实体集,所以这也可能是一个问题。

有没有办法解决这个问题?

【问题讨论】:

可能重复? ***.com/questions/224475/… 此问题中建议的解决方案是导入一个表值函数,该函数适用于 LINQ to SQL,但不适用于(当前)实体框架 【参考方案1】:

你上面定义的函数使用的是Entity SQL,而不是Transact SQL,所以我认为第一步是弄清楚CONTAINS(*,'text')是否可以用Entity SQL来表达。

Entity SQL 不支持此处描述的 * 运算符:http://msdn.microsoft.com/en-us/library/bb738573.aspx 如果我尝试

entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(*, 'text')");

我得到了和你上面一样的错误。如果我尝试显式传递它的工作列:

entities.CreateQuery<TABLE_NAME>("select value t from TABLE_NAME as t where CONTAINS(t.COLUMN_NAME, 'text')");

但是当我查看 SQL 时,它会将其转换为 LIKE 表达式。

ADO.NET:Execute Reader "SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[TABLE_NAME] AS [Extent1]
    WHERE (CASE WHEN ([Extent1].[COLUMN_NAME] LIKE '%text%') THEN cast(1 as bit) WHEN ( NOT ([Extent1].[COLUMN_NAME] LIKE '%text%')) THEN cast(0 as bit) END) = 1
)  AS [GroupBy1]"

如果您无法使用 Entity SQL 表达查询,则必须使用存储过程或其他机制来直接使用 Transact SQL。

【讨论】:

【参考方案2】:

我在我的代码中插入了一个小函数,在一个继承自 Context 类的类中,它指向我的支持全文搜索的 SQL 函数,我的解决方案对你的解决方案有点封闭(不允许指定文本搜索类型),它返回一个 IEnumerable,本质上是一个与搜索条件匹配的主键列表,类似这样;

public class myContext : DataContext


     protected class series_identity
     
            public int seriesID;

            series_identity()  
     ;

            [Function(Name = "dbo.fnSeriesFreeTextSearchInflectional", IsComposable = true)]
            protected IQueryable<series_identity> SynopsisSearch([Parameter(DbType = "NVarChar")] string value)
            
                return this.CreateMethodCallQuery<series_identity>(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), value);
            

            public IEnumerable<int> Search(string value)
            
                var a = from t1 in SynopsisSearch(value)
                        select t1.seriesID;

                return a;
            
;

用法类似于;

myContext context = new myContext();

IEnumerable<int> series_identities = (from t1 in context.Search("some term")
                                                  select t1).Distinct();

【讨论】:

【参考方案3】:

这超出了我的范围,但你能试试吗

from product in Products where MyModel.FullTextSearch(product, "FORMSOF(INFLECTIONAL, robe)") select product 

我的理由是在 SQL Server 中它需要两个参数。

【讨论】:

以上是关于sql server CONTAINS用法??的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 全文搜索 CONTAINS() 是不是容易受到 SQL 注入的攻击?

Django filter中contains 用法

使用 Contains() 时达到 2100 参数限制 (SQL Server)

SQL Server CONTAINS Predicate - 使用列值作为 <contains_condition>

如何强制 SQL Server 在 WHERE 子句之前处理 CONTAINS 子句?

将 SQL Server 的 CONTAINS() 作为模型定义函数导入