• 高亮显示
Highlighting
高亮显示使您能够从包含匹配关键字的文档中获取高亮的文本片段(称为摘要)。
SQL 的 HIGHLIGHT() 函数、通过 HTTP 的 JSON 查询中的 "highlight" 属性,以及 PHP 客户端中的 highlight()函数都利用内置的文档存储来检索原始字段内容(默认启用)。
SQL:
SELECT HIGHLIGHT() FROM books WHERE MATCH('try');+----------------------------------------------------------+
| highlight() |
+----------------------------------------------------------+
| Don`t <b>try</b> to compete in childishness, said Bliss. |
+----------------------------------------------------------+
1 row in set (0.00 sec)JSON:
POST /search
{
"index": "books",
"query": { "match": { "*" : "try" } },
"highlight": {}
}PHP:
Java:
C#:
在使用 SQL 进行高亮显示搜索结果时,由于 MySQL 协议的限制,您将从多个字段中接收的摘要片段组合为一个字符串。您可以通过 field_separator 和 snippet_separator 选项调整这些连接分隔符,详细信息如下。
通过 HTTP 执行 JSON 查询或使用 PHP 客户端时,不存在此类限制,结果集中包含字段数组,每个字段包含片段数组(无分隔符)。
请注意,像 limit、limit_words 和 limit_snippets 这样的片段生成选项默认会单独应用于每个字段。您可以使用 limits_per_field 选项更改此行为,但这可能会导致不希望的结果。例如,一个字段可能包含匹配的关键字,但由于在高亮引擎中的排名不如其他字段的片段,因此未将该字段中的片段包含在结果集中。
目前,高亮算法优先考虑更好的片段(包含更紧密的短语匹配),然后是包含尚未包含在结果中的关键字的片段。通常,它的目标是为查询高亮最佳匹配,并尽可能高亮所有查询关键字,受限于设置的限制。如果在当前字段中未找到匹配项,则默认情况下会根据限制对文档的开头进行裁剪并返回。要改为返回空字符串,可以将 allow_empty 选项设置为 1。
高亮显示在所谓的 post limit 阶段执行,这意味着片段生成不仅会延迟到准备好整个最终结果集之后,还会在应用 LIMIT 子句后执行。例如,使用 LIMIT 20,10 子句时,HIGHLIGHT() 函数最多调用 10 次。
高亮选项
高亮显示提供了一些可选的选项,用于微调片段生成,适用于 SQL、HTTP 和 PHP 客户端。
before_match
在匹配关键字之前插入的字符串。可以在此字符串中使用 %SNIPPET_ID% 宏。该宏的第一个出现位置将替换为当前片段中的递增编号。默认情况下,编号从 1 开始,但可以使用 start_snippet_id 选项覆盖。%SNIPPET_ID% 在每个新文档的开始处重置。默认值为 <b>。
after_match
在匹配关键字之后插入的字符串。默认值为 </b>。
limit
片段的最大大小,以符号(代码点)为单位。默认值为 256。此选项默认应用于每个字段,参见 limits_per_field。
limit_words
限制结果中可以包含的最大单词数。请注意,此限制适用于所有单词,而不仅仅是匹配的高亮关键字。例如,如果高亮显示 Mary,并选择片段 Mary had a little lamb,则它将为此限制贡献 5 个单词,而不仅仅是 1 个。默认值为 0(无限制)。此选项默认应用于每个字段,参见 limits_per_field。
limit_snippets
限制结果中可以包含的片段的最大数量。默认值为 0(无限制)。此选项默认应用于每个字段,参见 limits_per_field。
limits_per_field
确定 limit、limit_words 和 limit_snippets 是作为每个字段的单独限制,还是作为整个文档的全局限制。如果此选项设置为 0,则单个文档的所有高亮结果必须在指定限制内。缺点是如果高亮引擎认为某些片段更相关,则可能在一个字段中高亮多个片段,而另一个字段中没有任何片段。默认值为 1(使用每字段限制)。
around
选择每个匹配关键字块周围的单词数。默认值为 5。
use_boundaries
确定是否通过短语边界字符(根据表设置中的 phrase_boundary 指令配置)进一步拆分片段。默认值为 0(不使用边界)。
weight_order
指定是否按相关性(递减权重)对提取的片段进行排序,还是按文档中的出现顺序(递增位置)进行排序。默认值为 0(不按权重排序)。
force_all_words
忽略长度限制,直到结果包含所有关键字。默认值为 0(不强制包含所有关键字)。
start_snippet_id
设置 %SNIPPET_ID% 宏的起始值(在 before_match、after_match 字符串中检测并扩展)。默认值为 1。
html_strip_mode
定义 HTML 去除模式设置。默认值为 index,表示使用表设置。其他值包括 none 和 strip,它们分别强制跳过或应用去除,无论表设置如何;retain 则保留 HTML 标记并保护其不被高亮显示。retain 模式只能在高亮显示完整文档时使用,因此要求未设置任何片段大小限制。允许的字符串值为 none、strip、index 和 retain。
allow_empty
允许在当前字段中未能生成片段时返回空字符串(没有关键字匹配或没有片段符合限制)。默认情况下,将返回原始文本的开头,而不是空字符串。默认值为 0(不允许空结果)。
snippet_boundary
确保片段不跨越句子、段落或区域边界(在使用启用了相应索引设置的表时)。允许的值为 sentence、paragraph 和 zone。
emit_zones
在每个片段之前发出一个包含区域名称的 HTML 标签。默认值为 0(不发出区域名称)。
force_snippets
确定是否强制生成片段,即使限制允许高亮显示全文。默认值为 0(不强制生成片段)。
SQL:
JSON:
PHP:
Java:
C#:
通过 SQL 实现高亮
HIGHLIGHT() 函数可用于高亮搜索结果。其语法如下:
默认情况下,它可以在没有参数的情况下使用。
SQL:
HIGHLIGHT() 从文档存储中检索所有可用的全文字段,并根据提供的查询对其进行高亮。查询中支持字段语法。字段文本由 field_separator 分隔,您可以在选项中对其进行修改。
SQL:
HIGHLIGHT() 中的可选第一个参数是选项列表。
SQL:
第二个可选参数是一个包含单个字段或逗号分隔的字段列表的字符串。如果提供了此参数,则仅从文档存储中获取并高亮指定的字段。空字符串作为第二个参数表示“获取所有可用字段”。
SQL:
或者,您可以使用第二个参数指定一个不带引号的字符串属性或字段名。在这种情况下,提供的字符串将根据提供的查询进行高亮,但字段语法将被忽略。
SQL:
第三个可选参数是查询,用于根据与用于搜索的查询不同的查询来高亮显示搜索结果。
SQL:
尽管 HIGHLIGHT() 设计用于处理存储的全文字段和字符串属性,但它也可以用于高亮任意文本。请注意,如果查询包含任何字段搜索运算符(例如,@title hello @body world),此时将忽略它们的字段部分。
SQL:
几个选项仅在生成单个字符串作为结果时适用(而不是片段数组)。这仅适用于 SQL 的 HIGHLIGHT() 函数:
snippet_separator
用于插入片段之间的字符串。默认值为 ...。
field_separator
用于插入字段之间的字符串。默认值为 |。
另一种高亮文本的方式是使用 CALL SNIPPETS 语句。这在大多数情况下与 HIGHLIGHT() 功能相同,但无法使用内置的文档存储。然而,它可以从文件中加载源文本。
通过 HTTP 实现高亮
要在通过 HTTP 的 JSON 查询中高亮全文搜索结果,字段内容必须存储在文档存储中(默认启用)。在示例中,全文字段 content 和 title 从文档存储中获取,并根据 query 子句中指定的查询进行高亮。
高亮的片段在 hits 数组的 highlight 属性中返回。
JSON:
PHP:
Java:
C#:
要高亮所有可能的字段,请将一个空对象传递给 highlight 属性。
JSON:
PHP:
Java:
C#:
除了常见的高亮选项外,JSON 查询通过 HTTP 还提供了一些同义选项:
fields
fields 对象包含带有选项的属性名称。它也可以是字段名称的数组(没有任何选项)。
请注意,默认情况下,高亮会根据全文查询的结果进行高亮。在一般情况下,当您未指定要高亮的字段时,高亮基于全文查询。然而,如果您指定了要高亮的字段,则只有在全文查询匹配所选字段时才会进行高亮。
encoder
encoder 可以设置为 default 或 html。当设置为 html 时,它在高亮时保留 HTML 标记。其作用类似于 html_strip_mode=retain 选项。
highlight_query
highlight_query 选项允许您根据与搜索查询不同的查询进行高亮。其语法与主 query 中的语法相同。
JSON:
PHP:
Java:
C#:
pre_tags 和 post_tags
pre_tags 和 post_tags 用于设置高亮文本片段的开始和结束标签。它们的功能类似于 before_match 和 after_match 选项。这些选项是可选的,默认值分别为 <b> 和 </b>。
JSON:
PHP:
Java:
C#:
no_match_size
no_match_size 类似于 allow_empty 选项。如果设置为 0,它的作用等同于 allow_empty=1,当无法生成片段时允许返回空字符串作为高亮结果。否则,将返回字段的开头部分。此选项是可选的,默认值为 1。
JSON:
PHP:
Java:
C#:
order
order 用于设置提取片段的排序顺序。如果设置为 "score",它会按相关性顺序对提取的片段进行排序。此选项是可选的,功能类似于 weight_order 选项。
JSON:
Java:
C#:
fragment_size
fragment_size 设置片段的最大大小(以符号为单位)。它可以是全局设置或按字段设置。按字段设置会覆盖全局设置。此选项是可选的,默认值为 256,功能类似于 limit 选项。
JSON:
Java:
C#:
number_of_fragments
number_of_fragments 限制结果中片段的最大数量。像 fragment_size 一样,它可以是全局的,也可以是按字段的。此选项是可选的,默认值为 0(无限制),功能类似于 limit_snippets 选项。
JSON:
Java:
C#:
limit, limit_words, limit_snippets
选项如 limit、limit_words 和 limit_snippets 可以设置为全局或按字段设置。全局设置用于每个字段,除非按字段设置覆盖它们。在示例中,title 字段使用默认的限制设置,而 content 字段使用不同的限制。
JSON:
Java:
C#:
limits_per_field
可以通过指定 limits_per_field=0 来强制执行全局限制。设置此选项意味着所有组合的高亮结果必须在指定的限制内。缺点是如果高亮引擎认为某些片段更相关,您可能会在一个字段中看到多个高亮片段,而在另一个字段中没有任何片段。
JSON:
Java:
C#:
CALL SNIPPETS
CALL SNIPPETS 语句根据提供的数据和查询,使用指定的表设置构建一个片段。它无法访问内置的文档存储,因此推荐使用 HIGHLIGHT() 函数。
其语法为:
data
data 用作提取片段的源。它可以是单个字符串,也可以是用大括号括起来的字符串列表。
table
table 指的是用于片段生成的文本处理设置的表名称。
query
query 是用于构建片段的全文查询。
opt_value 和 opt_name
opt_value 和 opt_name 表示片段生成选项。
SQL:
大多数选项与 HIGHLIGHT() 函数 相同。然而,有几个选项只能用于 CALL SNIPPETS。
以下选项可以用于高亮存储在独立文件中的文本:
load_files
启用此选项时,第一个参数将被视为文件名,而不是数据,用于提取片段。服务器端将加载指定的文件以获取数据。启用此标志时,每个请求最多可使用 max_threads_per_query 个工作线程并行处理工作。默认值为 0(无限制)。要在远程代理之间分配片段生成工作,可在包含一个本地代理和多个远程代理的分布式表中调用片段生成。使用 snippets_file_prefix 选项生成最终文件名。例如,当 searchd 配置为 snippets_file_prefix = /var/data_ 并提供 text.txt 作为文件名时,片段将从 /var/data_text.txt 的内容中生成。
load_files_scattered
此选项仅适用于与远程代理的分布式片段生成。片段生成的源文件可以分布在不同的代理中,主服务器将合并所有无错误的结果。例如,如果分布式表的一个代理有 file1.txt,另一个代理有 file2.txt,并且您使用 CALL SNIPPETS 包含这两个文件,searchd 将合并代理结果,因此您将获得来自 file1.txt 和 file2.txt 的结果。默认值为 0。
如果 load_files 选项也启用,那么如果任何文件在任何地方不可用,请求将返回错误。否则(如果未启用 load_files),对于所有不存在的文件,它将返回空字符串。searchd 不会将此标志传递给代理,因此如果文件不存在,代理不会生成严重错误。如果您希望确保所有源文件都已加载,请将 load_files_scattered 和 load_files 都设置为 1。如果某些代理上的某些源文件不存在并不重要,则只设置 load_files_scattered 为 1。
SQL:
最后更新于