blog-post

如何高亮搜索结果

在本教程中,您将学习如何在 Manticore Search 中高亮搜索结果。如果您想改善应用程序或网站中搜索结果的可读性,可以利用搜索结果高亮功能。

高亮 使您能够获取包含匹配关键词的搜索结果片段。它有助于改善您应用程序的搜索体验。

介绍


您可以使用几种方法在 Manticore Search 中高亮文本中的关键词。

  • 语句 CALL SNIPPETS 允许获取从文档中提取的片段列表(称为片段),这些片段包含匹配项。它可以与搜索查询分开使用,以高亮单个字符串或字符串列表。以下是一个示例:
    CALL SNIPPETS('my text with keyword', 'index', 'keyword');
  • 函数 SNIPPET() 根据提供的数据和查询构建一个片段,使用指定的索引设置。该函数主要在 SELECT 语句中使用,以高亮给定文本、字段值或通过 UDF(用户定义函数)从其他源获取的文本。它可以用于高亮与匹配条件相同的查询或其他查询,具体取决于您。就像这样:
    SELECT SNIPPET(content,'camera') FROM index WHERE MATCH('camera');
  • 函数 HIGHLIGHT() 可用于高亮搜索结果。此函数在 Manticore 3.2.2 版本中添加。它使您能够更轻松地在将文档存储在 Manticore 中时高亮关键词,而不仅仅是将其编入索引。以下是调用的示例:
    SELECT HIGHLIGHT() FROM index WHERE MATCH('text feature');

前两个 CALL SNIPPETSSNIPPET() 提供了获取包含所搜索关键词匹配项的文档片段列表的能力。最后一个 HIGHLIGHT() 则从文档存储中获取所有可用字段,并根据给定的查询进行高亮。与 SNIPPET() 不同,HIGHLIGHT() 支持查询中的字段语法。

这三者共享相同的高亮选项,我们将在接下来的步骤中讨论这些选项。在本教程中,我们将展示使用 HIGHLIGHT() 的示例。

假设您有一个名为 ‘highlight’ 的索引,其设置如下:

index highlight
{
        type = rt
        path = highlight
        rt_field = title
        rt_field = content
        rt_attr_uint = gid
        stored_fields = title, content
        index_sp = 1
        html_strip = 1
}

基本用法


一个简单的示例:

首先,添加一个文档:

INSERT INTO highlight(title,content,gid) VALUES('语法高亮','语法高亮是文本编辑器的一项功能,这些编辑器用于编程、脚本编写或标记语言,例如 HTML。该功能根据术语的类别显示文本,特别是源代码,使用不同的颜色和字体。[1] 此功能便于在结构化语言(例如编程语言或标记语言)中编写,因为结构和语法错误在视觉上是明显不同的。高亮并不影响文本本身的含义;它仅供人类读者使用。',1);

然后运行 SELECT HIGHLIGHT()

SELECT HIGHLIGHT() AS h FROM highlight WHERE MATCH('text feature')\G
*************************** 1. row ***************************
h: 语法高亮是一个 <b>feature</b>  <b>text</b> 编辑器,这些编辑器被用 ...,例如 HTML。这个 <b>feature</b> 显示 <b>text</b>,特别是源代码, ... 的术语。[1]  <b>feature</b> 便于在一个结构化 ... 影响 <b>text</b> 本身的含义;它仅供 ...

默认情况下,任何匹配的单词都用 ‘bold’ 标签高亮,且每个匹配周围最多选择 5 个单词来构成一个段落。
段落默认用 ... 分隔。

HTML 标签用于高亮匹配项,因为片段通常是在 HTML 内容中显示,但您可以使用 “before_match”、“after_match”、“around” 和 “chunk_separator” 设置自定义行为。例如:

SELECT HIGHLIGHT({before_match='*',after_match='*',around=1,chunk_separator='###'}) AS h FROM highlight WHERE MATCH('text feature')\G
*************************** 1. row ***************************
h: ### a *feature* of *text*###. The *feature* displays *text*###] This *feature* facilitates### the *text* itself###

控制片段大小


默认设置将最大片段大小限制为 256 个字符(在同名设置 “limit” 下)。您可以这样更改它:

SELECT HIGHLIGHT({limit=10}) AS h FROM highlight WHERE MATCH('text feature')\G
*************************** 1. row ***************************
h:  ...  a <b>feature</b> ...

另一个可以更改的限制是片段中包含的单词数量,这由 “limit_words” 定义:

SELECT HIGHLIGHT({limit_words=5},'content') AS h FROM highlight WHERE MATCH('text feature')\G
*************************** 1. row ***************************
h: ... . 这个 <b>feature</b> 显示 <b>text</b>,特别是 ...

还可以限制段落的数量,例如,如果我们只想获取一个段落:

SELECT HIGHLIGHT({limit_passages=1}) AS h FROM highlight WHERE MATCH('text feature')\G
*************************** 1. row ***************************
h:  ...  语言,例如 HTML。这个 <b>feature</b> 显示 <b>text</b>,特别是源代码, ...

HIGHLIGHT() 函数的默认行为是在由限制定义的空间内返回找到的段落,段落之间用定义的分隔符分隔。
由于限制可能不足以覆盖所有段落,我们可能只能获得部分可能的段落。

为了演示这一点,让我们先添加一个较长文本的文档。

INSERT INTO highlight(title,content) values('wikipedia','语法高亮是用于编程、脚本或标记语言(如HTML)的文本编辑器的一项功能。该功能根据术语的类别以不同的颜色和字体显示文本,尤其是源代码。[1] 此功能有助于以结构化语言(例如编程语言或标记语言)编写,因为结构和语法错误在视觉上是不同的。高亮显示并不影响文本本身的含义;它仅针对人类读者。语法高亮是一种二级标注,因为高亮部分不是文本含义的一部分,而是用来强化其含义。一些编辑器还将语法高亮与其他功能(如拼写检查或代码折叠)结合起来,作为对语言之外的编辑辅助。 内容 1 实用好处 2 文本编辑器中的支持 3 语法元素 3.1 示例 4 历史和限制 5 另见 6 参考 实用好处 高亮显示缺失分隔符的效果(在watch=false后)在JavaScript中 语法高亮是一种提高文本可读性和上下文的策略;尤其是对于跨越几页的代码。读者可以轻松忽略大段评论或代码,具体取决于他们正在寻找的内容。语法高亮还帮助程序员发现程序中的错误。例如,大多数编辑器以不同的颜色突出显示字符串文字。因此,由于文本的对比色,发现缺失的分隔符要容易得多。大括号匹配是许多流行编辑器的另一个重要特性。这使得快速检查是否缺少大括号,或者通过以不同颜色高亮配对来定位光标所在的大括号的匹配变得简单。在PPIG会议上发表的一项研究评估了语法高亮对短程序理解的影响,发现语法高亮的存在显著缩短了程序员内化程序语义所需的时间。[2] 此外,在研究过程中收集的来自眼动仪的数据表明,语法高亮使程序员对诸如关键字这样的标准语法组件的关注度降低。 文本编辑器中的支持 gedit支持语法高亮 一些文本编辑器还可以以适合打印或导入到文字处理和其他类型文本格式化软件的格式导出彩色标记;例如作为HTML、彩色LaTeX、PostScript或RTF版本的语法高亮。有几个可以在其他应用程序中使用的语法高亮库或“引擎”,但它们本身并不是完整的程序,例如PHP的通用语法高亮(GeSHi)扩展。对于支持多种语言的编辑器,用户通常可以指定文本的语言,例如C、LaTeX、HTML,或者文本编辑器可以基于文件扩展名或通过扫描文件内容自动识别。这种自动语言检测会带来潜在的问题。例如,用户可能希望编辑包含:多种语言的文档(例如在编辑包含嵌入JavaScript代码的HTML文件时),未被识别的语言(例如在编辑一种不常见或相对较新的编程语言的源代码时),与文件类型不同的语言(例如在无扩展名文件中编辑源代码,而编辑器使用文件扩展名来检测语言)。在这些情况下,不清楚使用何种语言,文档可能不会被高亮显示或被错误高亮显示。 语法元素 大多数具有语法高亮的编辑器允许为语法的数十个不同词法子元素指定不同的颜色和文本样式。这些包括关键字、注释、控制流语句、变量和其他元素。程序员经常重度自定义他们的设置,试图在不使代码难以阅读的情况下显示尽可能多的有用信息。');

现在让我们突出显示它:

SELECT HIGHLIGHT({},'content') AS h FROM highlight WHERE MATCH('syntax')\G
*************************** 1. row ***************************
h: <b>语法</b>高亮是....语言,因为结构和<b>语法</b>错误在视觉上是不同的。高亮显示...
*************************** 2. row ***************************
h: ...<b>语法</b>高亮的版本。有几个<b>语法</b>高亮库...错误高亮显示。<b>语法</b>元素大多数具有<b>语法</b>高亮的编辑器允许不同...

对于新添加的文档,我们看到HIGHLIGHT()没有给出所有段落。我们可以增加限制以克服这一点,问题是多远。如果我们使用过高的值,HIGHLIGHT()将返回内容的全部,包括高亮部分:

SELECT HIGHLIGHT({limit=10000},'content') AS h FROM highlight WHERE MATCH('syntax')\G
*************************** 1. row ***************************
h: <b>语法</b>高亮是用于编程、脚本或标记语言(如HTML)的文本编辑器的一项功能。该功能根据术语的类别以不同的颜色和字体显示文本,尤其是源代码。[1] 此功能有助于以结构化语言(例如编程语言或标记语言)编写,因为结构和<b>语法</b>错误在视觉上是不同的。高亮显示并不影响文本本身的含义;它仅针对人类读者。
*************************** 2. row ***************************
h: <b>语法</b>高亮显示是文本编辑器的一个特性,这些编辑器用于编程、脚本或标记语言,如HTML。该特性根据术语的类别以不同的颜色和字体显示文本,尤其是源代码。[1] 该特性有助于在诸如编程语言或标记语言的结构化语言中进行书写,因为结构和<b>语法</b>错误在视觉上是明显不同的。高亮显示不会影响文本本身的含义;它仅用于人类读者。<b>语法</b>高亮显示是一种二次符号,因为高亮不属于文本的意义部分,而是用于加强它。一些编辑器还将<b>语法</b>高亮显示与其他功能集成,如拼写检查或代码折叠,这些都是对语言的编辑辅助。 目录 1 实际好处 2 文本编辑器中的支持 3 语法元素 3.1 示例 4 历史和局限性 5 另见 6 参考 实际好处 高亮显示在Javascript中的缺失分隔符效应(在watch=false之后)<b>语法</b>高亮显示是一种改善文本可读性和上下文的策略;尤其是对于跨越几页的代码。读者可以根据他们正在寻找的内容轻松忽略大量注释或代码。<b>语法</b>高亮显示还帮助程序员发现程序中的错误。例如,大多数编辑器以不同的颜色高亮字符串字面量。因此,发现缺失的分隔符就容易得多,因为文本的对比色。括号匹配是许多流行编辑器的另一个重要特性。这使得很容易看出是否遗漏了一个括号,或者通过以不同颜色高亮显示光标所在的括号来定位括号的匹配。发表在PPIG会议上的一项研究评估了<b>语法</b>高亮显示对短程序理解的影响,发现<b>语法</b>高亮的存在显著减少了程序员内化程序语义所需的时间。[2] 此外,研究期间收集的来自眼动仪的数据表明,<b>语法</b>高亮使程序员能够减少对标准语法组件如关键词的关注。 文本编辑器中的支持 gedit 支持 <b>语法</b>高亮显示 一些文本编辑器还可以以适合打印或导入到文字处理和其他文本格式化软件的格式导出着色标记;例如作为HTML、彩色LaTeXPostScriptRTF版本的<b>语法</b>高亮显示。有几个<b>语法</b>高亮显示库或“引擎”可以在其他应用程序中使用,但本身并不是完整的程序,例如用于PHP的通用<b>语法</b>高亮器(GeSHi)扩展。对于支持多种语言的编辑器,用户通常可以指定文本的语言,例如CLaTeXHTML,或者文本编辑器可以根据文件扩展名自动识别,或通过扫描文件内容来识别。这种自动语言检测会带来潜在问题。例如,用户可能希望编辑包含:多于一种语言的文档(例如,当编辑包含嵌入的Javascript代码的HTML文件时),一种未被识别的语言(例如,当编辑一种冷门或相对较新的编程语言的源代码时),一种与文件类型不同的语言(例如,当在一个不带扩展名的文件中编辑源代码,而这个编辑器使用文件扩展名来检测语言时)。在这些情况下,尚不清楚应该使用哪种语言,文档可能不会被高亮显示或被错误地高亮显示。 <b>语法</b>元素 大多数带有<b>语法</b>高亮显示的编辑器允许为<b>语法</b>的几十个不同词汇子元素提供不同的颜色和文本样式。这些包括关键词、注释、控制流语句、变量和其他元素。程序员通常会严重自定义他们的设置,以尽可能多地显示有用的信息,而又不让代码难以阅读。

如果我们只想要突出的段落而不是整个文本,我们需要使用选项“force_passages”:

SELECT HIGHLIGHT({limit=10000,force_passages=1},'content') AS h FROM highlight WHERE MATCH('语法')\G
*************************** 1. row ***************************
h: <b>语法</b>高亮显示是一个 ... 语言作为两者结构和<b>语法</b>错误在视觉上是显著不同的。高亮 ...
*************************** 2. row ***************************
h: <b>语法</b>高亮显示是一个 ... 语言作为两者结构和<b>语法</b>错误在视觉上是显著不同的。高亮 ... 仅供人类读者。<b>语法</b>高亮显示是一种 ... 它。一些编辑器还在其他功能中集成<b>语法</b>高亮显示,如 ... (在watch=false之后)在Javascript<b>语法</b>高亮显示是一种策略 ... 他们正在寻找的内容。<b>语法</b>高亮显示也帮助程序员找到 ... PPIG评估了<b>语法</b>高亮显示对短程序理解的影响 ... ,发现<b>语法</b>高亮的存在显著减少了程序员 ... 在研究期间收集的数据暗示<b>语法</b>高亮使程序员能够减少 ... 文本编辑器中的支持 gedit 支持 <b>语法</b>高亮显示 一些文本编辑器也可以 ... 版本的<b>语法</b>高亮显示。有几个<b>语法</b>高亮显示库或 ... 本身,并不是完整的程序,例如通用<b>语法</b>高亮器(GeSHi)扩展用于PHP ... 被错误地高亮显示。<b>语法</b>元素 大多数带有<b>语法</b>高亮显示的编辑器允许 ... 不同词汇子元素的<b>语法</b>。这些包括关键词、注释、控制 ...

另一种查看应用了高亮显示的整个文本的方法是简单地使用limit=0:

SELECT HIGHLIGHT({limit=0},'content') AS h FROM highlight WHERE MATCH('文本特性')\G
*************************** 1. row ***************************
h: 语法高亮是 <b>文本</b> 编辑器的一个 <b>特性</b>,用于编程、脚本或标记语言,例如 HTML。该 <b>特性</b> 根据术语的类别以不同的颜色和字体显示 <b>文本</b>,特别是源代码。[1] 这个 <b>特性</b> 有助于以结构化语言(如编程语言或标记语言)进行书写,因为结构和语法错误在视觉上是不同的。高亮不会影响 <b>文本</b> 本身的含义;它仅仅是为了人类读者而设计。
*************************** 2. row ***************************
h: 语法高亮是 <b>文本</b> 编辑器的一个 <b>特性</b>,用于编程、脚本或标记语言,例如 HTML。该 <b>特性</b> 根据术语的类别以不同的颜色和字体显示 <b>文本</b>,特别是源代码。[1] 这个 <b>特性</b> 有助于以结构化语言(如编程语言或标记语言)进行书写,因为结构和语法错误在视觉上是不同的。高亮不会影响 <b>文本</b> 本身的含义;它仅仅是为了人类读者而设计。语法高亮是一种次要标注,因为突出显示不是 <b>文本</b> 意义的一部分,但用于增强它。一些编辑器还将语法高亮与其他特性集成,例如拼写检查或代码折叠,作为编辑的辅助工具,这些工具与语言无关。 内容 1 实际好处 2 在 <b>文本</b> 编辑器中的支持 3 语法元素 3.1 示例 4 历史及限制 5 另见 6 参考 实际好处突出显示缺失分隔符的效果(在 Javascript 中为 watch=false) 语法高亮是一种改善 <b>文本</b> 可读性和上下文的策略;尤其是对于跨越几页的代码。读者可以轻松忽略大量的注释或代码,具体取决于他们正在寻找什么。语法高亮还有助于程序员发现其程序中的错误。例如,大多数编辑器以不同的颜色突出显示字符串文本。结果,因为 <b>文本</b> 的对比色,使得发现缺失的分隔符变得更加容易。括号匹配是许多流行编辑器的另一个重要 <b>特性</b>。这使得查看是否遗漏了括号或定位光标所在的括号匹配变得简单,通过用不同颜色突出显示配对的括号。一项在 PPIG 会议上发布的研究评估了语法高亮对短程序理解的影响,发现语法高亮的存在显著减少了程序员内化程序语义所需的时间。[2] 此外,在研究期间从眼动仪收集的数据表明,语法高亮使程序员能更少关注标准的句法组成部分,例如关键字。在 <b>文本</b> 编辑器中的支持 gedit 支持语法高亮 一些 <b>文本</b> 编辑器还可以以适合打印或导入到文字处理和其他类型的 <b>文本</b> 格式软件的格式导出带颜色的标记;例如作为HTML、上色的LaTeX、PostScript或RTF版本的语法高亮。还有几个语法高亮库或“引擎”可以在其他应用程序中使用,但本身并不是完整的程序,例如 PHP 的通用语法高亮(GeSHi)扩展。对于支持多种语言的编辑器,用户通常可以指定 <b>文本</b> 的语言,例如 C、LaTeX、HTML,或者 <b>文本</b> 编辑器可以根据文件扩展名或扫描文件内容自动识别。这种自动语言检测可能会出现潜在的问题。例如,用户可能想编辑包含:多种语言的文档(例如在编辑包含嵌入的 Javascript 代码的 HTML 文件时),未被识别的语言(例如在编辑某种模糊或相对较新的编程语言的源代码时),与文件类型不同的语言(例如在编辑没有扩展名的文件时,在使用文件扩展名来检测语言的编辑器中)。在这些情况下,使用的语言并不清楚,文档可能不会被高亮显示或被错误地高亮。语法元素 大多数带有语法高亮的编辑器允许为数十种不同的语法词法子元素分配不同的颜色和 <b>文本</b> 样式。这些包括关键字、注释、控制流语句、变量和其他元素。程序员通常会在设置中进行大量自定义,以尽可能显示有用的信息,而不使代码难以阅读。

HTML 去除与边界


如果我们的索引具有句子检测,我们可以配置高亮以不创建跨越句子的段落:

SELECT HIGHLIGHT({},'content') AS h FROM highlight WHERE MATCH('html text')\G
*************************** 1. row ***************************
h:  ...  高亮是 <b>文本</b> 编辑器的一个特性,用于 ... 标记语言,例如 <b>HTML</b>。该特性显示 <b>文本</b>,特别是源代码 ... 影响 <b>文本</b> 本身的含义;它仅仅是用来 ... 1 行结果 (0.00 )

在这个例子中,我们看到段落 ‘… 标记语言,例如 HTML。该特性显示 文本,特别是源代码 …’ 跨越了句子。

使用 passage_boundary=sentence 这个段落将被分成两部分:

SELECT HIGHLIGHT({passage_boundary='sentence'},'content') AS h FROM highlight WHERE MATCH('html text')\G
*************************** 1. row ***************************
h:  ...  高亮是用于 ... 的<b>文本</b>编辑器的一个特征,或者类似<b>HTML</b>的标记语言。 ... 该特征以不同的方式显示<b>文本</b>,尤其是源代码,这 ... 影响<b>文本</b>本身的含义;它仅仅是为了 ... 1 行在集合中 (0.05 秒)

让我们添加一个包含HTML内容的文档。

INSERT INTO highlight(title,content) values('html content','语法高亮的思想与<a title="结构编辑器" href="/wiki/Structure_editor">语法导向编辑器</a>的思想有显著重叠。第一个这种类型的代码编辑器是Wilfred Hansen在1969年推出的代码编辑器Emily。<sup id="cite_ref-hansen_3-0" class="reference"><a href="#cite_note-hansen-3">[3]</a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4">[4]</a></sup>它提供了先进的语言无关的<a title="自动完成" href="/wiki/Autocomplete">代码补全</a>功能,与现代具有语法高亮的编辑器不同,实际上使得创建语法上不正确的程序成为不可能。');

默认情况下,高亮将根据索引设置处理HTML内容。如果在索引中启用了HTML剥离,则HIGHLIGHT()结果也将被剥离HTML。

SELECT HIGHLIGHT({},'content') AS h FROM highlight WHERE MATCH('code class')\G
*************************** 1. row ***************************
h:  ... 第一个这种<b></b>的代码编辑器是Wilfred Hansen ... 1969 <b>代码</b>编辑器Emily[3][4 ... ]它提供了先进的语言无关<b>代码</b>补全功能,与现代 ...

如果我们想要高亮包含HTML标签,我们需要设置“html_strip_mode=none”:

SELECT HIGHLIGHT({html_strip_mode='none'},'content') AS h FROM highlight WHERE MATCH('code class')\G
*************************** 1. row ***************************
h:  ... 第一种这样的<b></b>编辑器的<b>代码</b>Wilfred ... 1969 <b>代码</b>编辑器,Emily <sup id="cite_ref-hansen_3-0" style="background: #EBE909; color: #000000;">class=" ... sup id="cite_ref-4" <b>class</b>="reference"><a title="自动完成" href="#cite_note- ... ="><b>代码</b>补全功能,和 ... 1 行在集合中 (0.05 秒)</a></sup>

请注意html_strip_mode=none可以高亮作为HTML语法一部分的单词,如’class’。
要保护HTML实体,可以使用保留模式,但这要求片段没有限制(limit=0):

SELECT HIGHLIGHT({html_strip_mode='retain',limit=0},'content') AS h FROM highlight WHERE MATCH('code class')\G *************************** 1. row *************************** h:
<p>语法高亮的思想与<a title="结构编辑器" href="/wiki/Structure_editor">语法导向编辑器</a>的思想有显著重叠。第一个这种类型的<b></b>的代码编辑器是Wilfred Hansen1969年推出的<b>代码</b>编辑器Emily<sup id="cite_ref-hansen_3-0" class="reference"><a href="#cite_note-hansen-3">[3]</a></sup><sup id="cite_ref-4" class="reference"><a href="#cite_note-4">[4]</a></sup>它提供了先进的语言无关的<a title="自动完成" href="/wiki/Autocomplete"><b>代码</b>补全</a>功能,与现代具有语法高亮的编辑器不同,实际上使得创建语法上不正确的程序成为不可能</p>

本教程解释了如何在Manticore Search中使用函数HIGHLIGHT()进行高亮。

互动课程

<img src="HIghlighting-optimized.webp" alt="img">

这篇博客文章以互动课程的形式提供,具有一个命令行,允许您与上述示例进行交互。

安装Manticore Search

安装Manticore Search