0

我正在尝试用基于 SQL Server 2008 R2 的索引替换基于关键字分析器的 Lucene.NET 索引。

我有一个表,其中包含我需要查询的自定义索引字段。索引列的值(见下文)是来自一系列 .NET 类型的自定义索引字段的名称/值对的组合——实际值是在运行时从属性中提取的,因为结构是未知的。

我需要能够使用 AND 和 OR 搜索集合名称和值对并返回查询匹配的行。

Id          Index
====================================================================
1           [Descriptor.Type]=[5][Descriptor.Url]=[/]
2           [Descriptor.Type]=[23][Descriptor.Url]=[/test]
3           [Descriptor.Type]=[25][Descriptor.Alternative]=[hello]
4           [Descriptor.Type]=[26][Descriptor.Alternative]=[hello][Descriptor.FriendlyName]=[this is a test]

一个简单的查询如下所示:

select * from Indices where contains ([Index], '[Descriptor.Url]=[/]');

该查询将导致以下错误:

Msg 7630, Level 15, State 2, Line 1
Syntax error near '[' in the full-text search condition '[Descriptor.Url]=[/]'.

因此,考虑到这一点,我更改了Index列中的数据以使用|而不是[and ]

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|');

现在,虽然该查询现在有效,但当我运行它时,将返回所有包含Descriptor.Url和开头的行/,而不是完全匹配的记录(在这种情况下正好是一个)。

我的问题是,我怎样才能逃避查询以解释[and]并确保只返回完全匹配的行?

一个更复杂的查询看起来有点像这样:

select * from Indices where contains ([Index], '[Descriptor.Type]=[12] AND ([Descriptor.Url]=[/] OR [Descriptor.Url]=[/test])');

谢谢,
基龙

4

2 回答 2

1

您的主要问题是使用 SQL 分词器和 CONTAINS 语法。默认情况下,SQL 分词器会消除标点符号,并将数字、日期、网址、电子邮件地址等标准化。它还将所有内容都小写,并词干。

因此,对于您的输入字符串:

[Descriptor.Type]=[5][Descriptor.Url]=[/]

您将在索引中添加以下标记(连同它们的位置)

描述符类型 nn5 5 描述符 url

(注:nn5 是一种简化查询不同格式的数字和日期的方法,原始数字也被索引在同一位置)

因此,如您所见,标点符号甚至没有存储在全文索引中,因此无法使用 CONTAINS 语句查询它。

所以你的陈述:

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|'); 

在将其提交到全文索引之前,实际上会被查询生成器归一化为“描述符 url”,因此在“url”旁边具有“描述符”的所有条目的命中,不包括标点符号。

您需要的是LIKE 语句

于 2011-02-15T19:03:23.147 回答
0

使用“|” 因为您的分隔符导致包含查询考虑 OR。这就是为什么你会得到意想不到的结果。您应该能够像这样逃脱括号:

SELECT * FROM Indices WHERE 
    contains ([Index], '[[]Descriptor.Type]=[[]12]') 
于 2011-02-09T18:08:39.950 回答