反向索引
GE为单元格字段值的子字符串查询提供了内置的反向索引支持。GE只索引TSL中标记为[index]属性的单元格字段值。
只有具有字符串类型的单元格字段才能被索引。有两种情况。1)单元格字段的类型为string。在子字符串查询处理期间,如果其索引字段的值包含查询的子字符串,则匹配单元格。2)单元格字段是字符串的集合,例如,List<string> 或者 List<List<string>>。在 查询处理期间,只要集合中的任何字符串包含查询的子字符串,单元格就会匹配。
索引声明:属性
要使字段建立索引,增加一个[index]属性:
cell MyCell
{
[Index]
string Name;
}
index属性仅对其类型为字符串或字符串集合的字段有效。
可以在嵌套字段上声明索引,例如:
struct leaf
{
[Index]
string data;
}
cell root
{
leaf substructure;
}
由于在GE中没有办法全局的识别这样的结构,因此struct leaf上的index属性单独不会生成有效的索引。只有当这样的机构包含在一个单元格 root, root.leaf.data,形成一个有效的索引。形成一个有效的索引。允许在子结构的子结构中包含索引字段,因此,cell.inner_1.inner_2. ... .leaf.data是可加索引的。
如果包含一个或多个索引字段的子结构包含在多个单元格结构中,那么将为每个单元格生成一个索引,并且索引彼此独立。
子串查询:
对于索引字段,我们可以通过调用带有字段标识符和查询字符串方法 Index.SubstringQuery。一个字段标识符,例如:Index.root.leaf.data,是否在索引类中定义了自动生成的嵌套类。它用于指定我们要查询的单元格字段:Index.root.leaf.data 标识了根单元中的叶子结构中的数据字段。Index.SubstringQuery(Index.root.leaf.data, "query string")返回单元格id列表。每个root.leaf.data字段值包含“query string”的数据字段值。
Index.SubstringQuery 方法同样接受一系列字符串查询,给定一个查询字符串序列q1, q2, ..., qn,这个方法将根据*q1*q2*...*qn*执行通配符搜索,它表示所有的字符串q1, q2, ..., qn是按照序列中指定的顺序匹配字符串的子字符串。
索引更新:
如果单元格不断更新,对索引字段的更新可能不会立即反映在索引中。也就是说,子字符串查询可能有假负数-单元格当前是匹配的,但尚未包含在索引中。为了排除假正数(以前匹配的单元格现在不匹配),我们需要在获得匹配的单元格id后再次检查单元格字段值。
系统定期更新索引。要手动更新索引,可以在特定字段标识符上调用Index.UpdateSubstringIndex
LINQ 集成
反向索引子系统与LINQ集成。爱选择器上的LINQ查询中,GE转换字符串的调用。在索引字段中包含反向索引查询。同样的规则适用于IEnumerable<string>.Contains.
更多的细节请查看LINQ。