查询和排序选项

单独使用查询字符串调用 Index.Search 方法时,系统会根据默认查询选项返回结果:

  • 按照降序排列所返回的文档
  • 以 20 个文档为一组,每次返回一组文档
  • 检索到的文档包含其所有原有字段

您可以使用 SearchOptions 结构体的实例作为 Search 的参数来更改这些选项。

SearchOptions 结构体可以指定一次返回多少个文档。它还支持自定义所检索文档的内容。您可以只检索文档标识符,或要求文档只包含其一部分字段。您还可以利用字段表达式(具有从文档中其他字段派生的值的字段),在检索到的文档中创建自定义字段。

除了查询选项之外,“SearchOptions”结构体还可以包含 SortOptions 结构体的实例。使用排序选项,您可以更改排序顺序,并根据多个键对结果排序。

SearchOptions

这些属性控制返回的结果数和顺序。互斥的 offset 和 cursor 选项支持分页,这两个选项指定要在结果中返回哪些选定的文档。

属性 说明 默认 上限
Limit 结果中可以返回的最大文档数。 20 1000
Offset 要返回的结果中的第一个文档的偏移量。 0。结果将包含所有匹配的文档(不超过上限)。 1000
Cursor 可以用于代替偏移量以按排序顺序检索文档组的游标。游标在传入和传出连续查询时会进行更新,因此可使每项新搜索在前一项搜索结束处继续。Go 搜索参考页面介绍了游标和偏移量。 Null。结果将包含所有匹配的文档(不超过上限)。 -
Sort 设置 SortOptions 结构体以控制搜索结果的排序。SortOptions 实例有自己的一组属性,将在下文中进行介绍。 Null。按递减顺序对文档进行排序。 -

这些属性控制在结果中显示的文档字段。

属性 说明 默认
IDsOnly 设置为 truefalse。如果为 true,则结果中返回的文档仅包含 ID,不包含任何字段。 false(返回所有字段)。
Fields 指定要包含在结果中的文档字段。可以指定的字段上限为 100 个。 返回所有文档字段(最多 100个字段)。
Expressions 字段表达式,描述要向搜索结果中所返回的每个文档添加的计算字段。这些字段会添加到文档的 expressions 属性中。请编写表达式(可包含一个或多个文档字段)来指定字段值。

SortOptions

SortOptions 的属性用于控制搜索结果的排序和评分。

属性 说明 默认
Expressions 表示文档多维排序方式的 SortExpressions 切片。
Scorer 可选的 Scorer。如果存在此对象,将根据搜索字词频率对文档进行评分。分数将在 _score 字段中提供。对文档进行评分的操作可能代价高昂(在计费操作和执行时间方面),并且可能会降低搜索速度。请谨慎使用评分。
Limit 需要评分和/或排序的最大对象数。最大值为 10,000。 1000

根据多个键进行排序

您可以根据多个排序键对搜索结果进行排序。每个键可以是简单的字段名称,也可以是根据多个字段计算得出的值。 此表达式根据下一部分中的规则进行构建。

SortExpression 还定义排序的方向以及在无法为文档计算表达式时使用的默认键值。以下是完整的属性列表:

属性 说明 默认
Expr 对每个匹配文档的结果进行排序时要进行求值的表达式。
Reverse true 时,逆转搜索结果排序,使其以升序(而不是默认降序)显示。 false
Default 表达式的默认值(在没有字段且无法为文档计算字段时使用)。对于文本排序,必须指定文本值。必须为数字排序指定数值。

对多值字段进行排序

根据某特定类型的一个多值字段排序时,系统只会使用分配给该字段的第一个值。例如,假设 DocA 和 DocB 两个文档都具有一个名为“color”的文本字段。赋予 DocA“color”字段的两个值依次为 (red, blue),赋予 DocB“color”字段的两个值依次为 (green, red)。当您指定根据“color”文本字段排序时,DocA 会按值“red”排序,DocB 会按值“green”排序。此排序不使用其他字段值。

排序或不排序

如果您未指定任何排序选项,则会自动按降序返回搜索结果。在这种情况下,返回的文档没有数量限制。如果您指定了任何排序选项,则系统会在选择所有匹配文档后执行排序。显式属性 SortOptions.Limit 控制排序文档的数量。排序文档的数量不能超过 10000,默认值为 1000。如果匹配文档多于 SortOptions.Limit 指定的数量,则搜索功能将仅检索指定数量的文档,并在排序后将其返回。 系统会从所有匹配文档的列表(降序排列)中选择要排序的文档。查询选择的匹配文档可能多于您可以排序的文档数量。如果您要使用查询选项且需要检索每个匹配文档,您应确保查询返回的文档数不超过您可以排序的文档数。

编写表达式

表达式用于定义字段表达式(在 SearchOptions 中设置)和排序表达式(在 SortOptions 中设置)。它们以字符串的形式编写:

"price * quantity"
"(men + women)/2"
"min(daily_use, 10) * rate"
"snippet('rose', flower, 120)"

涉及数值字段的表达式可以使用算术运算符(+、-、*、/)和下方列出的内置数值函数。涉及地理坐标点字段的表达式可以使用 geopoint 函数和 distance 函数。用于文本和 HTML 字段的表达式可以使用 snippet 函数。

表达式还可以包含以下特殊术语:

术语 说明
_rank 文档的排序属性。可用于字段表达式和排序表达式。
_score SortOptions 中加入 Scorer 时为文档分配的分数。此术语只能出现在排序表达式中,而不适用于字段表达式。

数值函数

用于定义 FieldExpressionsSortExpressions 值的表达式可以使用这些内置函数。其参数必须是数字、字段名称或使用数字和字段名称的表达式。

函数 说明 示例
max 返回参数中的最大值。 max(recommended_retail_price, discount_price, wholesale_price)
min 返回参数中的最小值。 min(height, width, length)
log 返回自然对数。 log(x)
abs 返回绝对值。 abs(x)
pow 具有两个数字参数。调用 pow(x, y) 会计算 x 的 y 次幂的值。 pow(x, 2)
count 使用一个字段名称作为其参数。返回文档中具有该名称的字段数。请记住,文档可以包含多个同名但类型不同的字段。注意:count 只能在 FieldExpressions 中使用。它无法在 SortExpressions 中显示。 count(user)

地理坐标点函数

以下函数可用于涉及地理坐标点字段的表达式。

函数 说明 示例
geopoint 指定具有明确经度和纬度的地理坐标点。 geopoint(-31.3, 151.4)
distance 计算两个地理坐标点之间的距离。请注意,两个参数中的任何一个都可以是地理坐标点字段的名称或对地理坐标点函数的调用。但是,只有一个参数可以是字段名称。 distance(geopoint(23, 134), store_location)

片段

片段是与查询字符串匹配并包含周围文本的文本字段片段。您可调用 snippet 函数来创建片段:

snippet(query, body, [max_chars])

query
带引号的查询字符串,指定要在字段中查找的文本。
body
文本、HTML 或 atom 字段的名称。
max_chars
片段中要返回的最大字符数。这是可选参数,默认为 160 个字符。

该函数返回一个 HTML 字符串。该字符串包含 body 字段值的片段,其中与查询匹配的文本以粗体显示。