文章
· 十一月 2, 2021 阅读大约需 12 分钟

IRIS 2021 技术文档 First Look 20 -- SQL 文本搜索

本文档向您介绍 InterSystems IRIS®数据平台对 SQL 文本搜索的支持,它为各种语言的非结构化文本数据提供语义上下文搜索。它涵盖了以下主题:

本文档介绍了 SQL 上下文感知文本搜索,并介绍了一些与索引文本数据相关的初始任务,以进行搜索和执行 SQL 搜索。一旦您完成了这个探索,您将在一个 SQL 列中为文本搜索建立索引,并执行几种类型的搜索。这些活动被设计为只使用默认设置和功能,以便您熟悉该功能的基本原理。有关 SQL 搜索的完整文档,请参见 SQL Search Guide(《SQL 搜索指南》)

处理非结构化文本的一个相关但独立的工具是自然语言处理(Natural Language ProcessingNLPSQL 搜索假定您知道要查找的内容。NLP 文本分析允许您在没有事先了解文本内容的情况下分析文本的内容

要浏览所有的技术概要(First Look),包括可以在 InterSystems IRIS 免费的评估实例上执行的那些,请参见 InterSystems First Looks(《InterSystems 技术概要》)。

  1. 为什么 SQL 搜索很重要

快速搜索非结构化文本数据的能力是访问许多公司和机构普遍存储的大量文本内容的基础。任何此类数据的搜索工具必须具有以下功能:

  • 快速搜索:InterSystems IRIS SQL 搜索可以快速搜索大量的数据,因为它搜索的是生成的优化数据索引,而不是顺序搜索数据本身。
  • 单词感知(Word-aware)搜索:SQL 搜索不是字符串搜索,它是基于文本中语义结构的搜索。SQL 搜索的最基本的语义结构是单词。这就减少了在字符串搜索中发现嵌入另一个单词中的字符串,或当字符串连接两个单词时产生的误报数量。
  • 实体感知(Entity-aware)搜索:SQL 搜索考虑了多个单词,这些单词根据语义关系分组形成实体。因此,它可以搜索指定顺序(位置短语)中的多个单词、出现在彼此特定接近范围内的单词(无论顺序如何),以及在实体的开头或结尾找到的单词。这使您能够将搜索范围缩小到在其他单词的指定上下文中找到的一个单词(或短语)
  • 语言感知(Language-aware)搜索:识别单词之间的语义关系是基于语言的。SQL 搜索包含十种自然语言的语义规则(语言模型)。它还提供对其他语言的支持。它不需要创建或关联字典或本体。

  • 模式匹配:SQL 搜索同时提供通配符匹配和正则表达式(RegEx)匹配,来匹配字符模式。
  • 模糊匹配:SQL 搜索为近似匹配提供模糊搜索,这些搜索考虑了搜索字符串的计算变化程度。这使拼写错误的匹配成为可能。
  • 派生匹配:SQL 搜索可以使用分解来匹配词根和组件词。SQL 搜索可以使用同义词表来匹配同义词和短语。
  1. InterSystems IRIS 如何实现 SQL 搜索

SQL 搜索可以搜索在 SQL 表的列中发现的文本数据。为了做到这一点,您必须为包含文本数据的列创建一个 SQL 搜索索引。InterSystems 将表列实现为持久化类中的属性。

有三个级别的索引可用,每个级别都支持附加的功能以及较低级别的所有功能:基本(Basic)、语义( Semantic)和分析(Analytic:

  • 基本(Basic支持单词搜索和位置短语搜索,包括使用通配符、短语中单词之间的范围、正则表达式(RegEx)匹配和共同出现搜索。
  • 语义(Semantic 支持所有的基本功能,并且还支持 InterSystems IRIS 自然语言处理(NLP)实体。它可以搜索实体,以及以实体开头或以实体结尾的单词或短语。它能识别 NLP 的属性,比如否定。
  • 分析(Analytic 支持所有的语义(Semantic)功能,也支持 NLP 路径。它还可以根据 NLP 优势和接近度分数进行搜索。

填充索引。像所有的 SQL 索引一样,您可以在数据填充表之后直接构建索引,也可以在将记录插入空表时让 SQL 自动构建索引条目。无论哪种情况,SQL 都会自动更新此索引作为后续插入、更新或删除操作的一部分。

您执行 SQL 搜索,编写一个 SELECT 查询,其中的 WITH 子句包含 %ID %FIND search_index() 语法。search_index() 函数的参数包括 SQL 搜索索引的名称和搜索字符串。这个搜索字符串可以包括通配符、位置短语和实体语法字符。搜索字符串还可以包括 ANDOR NOT 逻辑运算符。

  1. 尝试 SQL 搜索

使用 InterSystems IRIS SQL 搜索很容易。这个简单的程序将引导您完成搜索以字符串形式存储在 SQL 表列中的文本数据的基本步骤。

要使用该程序,您需要一个正在运行的 InterSystems IRIS 实例。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;该实例不需要在您正在工作的系统中(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS部署 InterSystems IRIS)。

您还将使用一个 IDE,如 VS Code Studio,在实例中创建 ObjectScript 代码。有关设置这些 IDE 并将其连接到您的实例的说明,请参见 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Visual Studio Code Studio
 

    1. 用前须知

要使用该程序,您需要一个正在运行的 InterSystems IRIS 实例。您对 InterSystems IRIS 的选择包括多种类型的已授权的和免费的评估实例;该实例不需要在您工作的系统中(尽管它们必须相互具有网络访问权限)。关于如何部署每种类型的实例的信息(如果您还没有可使用的实例),请参见 InterSystems IRIS Basics: Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中的 Deploying InterSystems IRIS部署 InterSystems IRIS)。

您还需要从 GitHub repo https://github.com/intersystems /Samples-Aviation 获得 Aviation.Event 表和相关文件。

    1. 下载和设置示例文件

Samples-Aviation 源(sources)必须可由实例访问。下载文件的程序取决于您所使用的实例类型,如下所示:

  • 如果您使用的是 ICM 部署的实例:
      1. 使用带有 -machine -interactive 选项的 icm ssh 命令,在托管实例的节点上打开默认 shell,例如:
icm ssh -machine MYIRIS-AM-TEST-0004 -interactive
      1. Linux 命令行上,使用以下命令之一将 repo 克隆到实例的数据存储卷(data storage volume。例如,对于部署在 Azure 上的配置,数据卷的默认挂载点(default mount point /dev/sdd因此您可以使用如下命令:
$ git clone https://github.com/intersystems/FirstLook-SQLBasics /dev/sdd/FirstLook-SQLBasics OR

$ wget -qO- https://github.com/intersystems/FirstLook-SQLBasics/archive/master.tar.gz | tar xvz

-C /dev/sdd

这些文件现在对容器文件系统上  /irissys/data/FirstLook-SQLBasics 中的 InterSystems IRIS 可用。

  • 如果您正在使用通过其他方式部署的容器化实例(授权版或社区版(Community Edition)):
  1. 在主机上打开 Linux 命令行。如果您在云节点上使用社区版(Community Edition),请使用 SSH 连接该节点,如在 Deploy and Explore InterSystems IRIS(《部署和探索 InterSystems IRIS)中所述。
  2. Linux 命令行上,使用 git clone wget 命令,如上所述,将 repo 克隆到容器中挂载为卷(mounted as a volume)的存储位置。
    • 对于社区版(Community Edition)实例,您可以克隆到实例的持久化 %SYS 目录 (存储特定于实例的配置数据的目录)。在 Linux 文件系统中,这个目录是 /opt/ISC/dur。这使得文件对容器文件系统上 /ISC/dur/FirstLook-SQLBasics 中的 InterSystems IRIS 可用。
    • 对于已授权的容器化实例,选择容器中作为卷挂载(mounted as a volume)的任何存储位置(如果使用它,包括持久化 %SYS 目录)。例如,如果您的 docker run 命令包含选项 -v /home/user1:/external,并且您将 repo 克隆到 /home/user1 则文件对容器文件系统上 /external/FirstLook-SQLBasics 中的 InterSystems IRIS 可用。
  • 如果您使用的是 InterSystems 学习实验室(Learning Labs)实例:
  1. 在集成 IDE 中打开命令行终端。
  2. 将目录更改为 /home/project/shared 并使用 git clone 命令克隆 repo
$ git clone https://github.com/intersystems/FirstLook-SQLBasics

该文件夹被添加到左边资源管理器(Explorer)面板的 Shared (共享)下,并且该目录对 /home/project/shared 中的 InterSystems IRIS 可用。

  • 如果您使用的是已安装的实例:
    • 如果实例的主机是安装了 GitHub 桌面(GitHub Desktop)的 Windows 系统:
    1. 在主机的 web 浏览器中进入 https://github.com/intersystems/Samples-Aviation
    2. 选择 Clone or download(克隆或下载) 然后选择 Open in Desktop(在桌面上打开)

这些文件对您的 GitHub 目录中的 InterSystems IRIS 可用,例如在

C:\Users\User1\Documents\GitHub\FirstLook-SQLBasics 中。

    • 如果主机是 Linux 系统,只需在 Linux 命令行上使用 git clone 命令或 wget 命令,就可以将 repo 克隆到您所选择的位置。

一旦您获得了示例文件,请按照"设置说明"下的 Samples-AviationREADME.md 文件中提供的步骤操作:

  1. 创建一个名为 SAMPLES 命名空间,如下所示:
    1. 使用 InterSystems IRIS Basics:Connecting an IDE(《InterSystems IRIS 基础:连接一个 IDE》)中URL described for your instance(为您的实例描述的 URL,在浏览器中打开您的实例的管理门户(Management Portal)。
    2. 选择 System Administration(系统管理) > Configuration(配置) > System Configuration(系统配置) > Namespaces(命名空间) ,进入 Namespaces(命名空间)页面。
    3. Namespaces(名称空间) 页面,选择 Create New Namespace(创建新的命名空间)。这将显示 New Namespace(新命名空间) 页面; 按照 System Administration Guide(《系统管理指南》) 中“Configuring InterSystems IRIS(《配置 InterSystems IRIS》)”章节中 Create/Modify a Namespace(创建/修改命名空间)中的说明使用此页面。 调用新的命名空间 SAMPLES
    4. 选择靠近页面顶部的 Save(保存) ,然后在生成的日志末尾选择 Close(关闭)
  2. 使 SAMPLES web 应用程序与 InterSystems IRIS 分析(Analytics 一起使用:
  • a.在管理门户(Management Portal)中,点击 System Administration(系统管理) > Security(安全) > Applications(应用程序) > Web Applicationsweb 应用程序)
  • b.点击最左侧列中的 /csp/samples 链接(假设您创建的命名空间名为 SAMPLES)
  • c. Enable(启用) 部分,选择 Analytics(分析)
  • d.点击 Save(保存)
  1. 使用 InterSystems IRIS Basics:Connecting an IDE InterSystems IRIS 基础:连接一个 IDE》)中procedure described for your instance为您的实例描述的程序打开 InterSystems 终端(Terminal),并输入以下命令,更改加载示例的命名空间:
set $namesapce="SAMPLES"
  1. 输入以下命令,将 .path 替换为包含您克隆或下载的 repo README.md LICENSE 文件的目录的完整路径:
do $system.OBJ.Load("<path>\buildsample\Build.AviationSample.cls","ck")
  1. 输入以下命令:
do ##class(Build.AviationSample).Build()

当出现提示时,输入包含 README.md LICENSE 文件的目录的完整路径。然后,该方法加载和编译代码,并执行其他需要的设置步骤。

    1. 创建和测试一个基本的 SQL 搜索索引

一旦代码编译完成(可能需要一两分钟),继续执行以下步骤:

  1. 使用您选择的 IDE,通过在 SAMPLES 命名空间中定义以下类(class)来创建基本 SQL 搜索(Basic SQL Search)索引
Class Aviation.TestSQLSrch Extends %Persistent 
  [DdlAllowed,Owner={UnknownUser},SqlRowIdPrivate,
  SqlTableName=TestSQLSrch ]
{
  Property UniqueNum As %Integer;
  Property Narrative As %String(MAXLEN=100000) [ SqlColumnNumber=3 ]; 
  Index NarrBasicIdx On (Narrative) As %iFind.Index.Basic(INDEXOPTION=0,LANGUAGE="en",LOWER=1);
  Index UniqueNumIdx On UniqueNum [ Type=index,Unique ];
}

这个示例创建了一个持久化类(表),其中包含一个 Narrative 属性(列),并为这个属性定义了一个基本 SQL 搜索(Basic SQL Search)索引。因为这是一个新类,所以您必须用文本数据填充表。

  1. 用文本数据填充表并构建 SQL 搜索索引。SQL 搜索索引的构建和维护与任何其他 SQL 索引一样。

并输入以下命令,以使用您下载的 Aviation.Event 表中的文本数据填充新表。在这个示例中,SQL 搜索索引是在添加每条记录时自动构建的:

 
set $namespace = "SAMPLES"
set in1="INSERT OR UPDATE INTO Aviation.TestSQLSrch (UniqueNum,Narrative) " 
set in2="SELECT %ID,NarrativeFull FROM Aviation.Event WHERE %ID < 100"
set myinsert=in1_in2
set tStatement=##class(%SQL.Statement).%New() 
set qStatus=tStatement.%Prepare(myinsert)
if qStatus'=1 {write "%Prepare failed:" DO $System.Status.DisplayError(qStatus) quit} 
set rset=tStatement.%Execute()
write !,"Total rows inserted=",rset.%ROWCOUNT

出于性能的考虑,您可能希望使用 %NOINDEX 选项来推迟构建索引,直到表被完全填充,然后使用 %Build() 方法构建 SQL 搜索索引(和任何其他定义的索引)。

或者,您可以在已经包含文本数据的现有持久化类中添加 SQL 搜索索引,然后使用 %Build() 方法填充 SQL 搜索索引。

  1. 在终端(Terminal)中打开一个 SQL Shell,如在 First Look:InterSystems SQL(《技术概要:InterSystems SQL》) Creating and Populating a Table With a SQL Script File使用 SQL Script 文件创建和填充表)的前几个步骤中所述,并使用 SQL 搜索作为 SELECT 查询的 WHERE 子句条件。WHERE 子句可以包含由 AND 逻辑关联的其他条件。在 SAMPLES 命名空间运行以下 SQL 查询:
SELECT %iFind.Highlight(Narrative,'"visibility [1-4] mile*" AND "temp* ? degrees"') FROM Aviation.TestSQLSrch
WHERE %ID %FIND search_index(NarrBasicIdx,'"visibility [1-4] mile*" "temp* ? degrees"',0,'en')
    • Search_index() 函数指定了一个 search_index 参数。这是为要搜索的属性(列)定义的 SQL 搜索索引。它可以是一个基本(Basic)、语义(Semantic)或分析(Analytic)索引。
    • Search_index() 函数指定了一个 search_item 参数。

这个示例将 search_item 定义为 "visibility [1-4] mile*" "temperature ? degree*"。这将以任意顺序返回包含两个位置短语的所有记录:

"visibility [1-4] mile*"返回单词“visibility”和“mile”之间有 1 4 个单词的短语。  因为 mile* 指定了一个通配符,它可以匹配 mile miles。例如,"visibility less than 1 mile ""visibility 10 miles ""visibility approximately 20 statute miles""visibility for many miles"

"temp* ? degrees"返回 "temp "开头、以 0 个或更多非空格通配符结尾的单词,一个缺失的单词,然后是单词"degree"的短语。因此,它将返回带有

短语 "temperature 20 degrees""temp. 20 degrees""temperature in degrees",以及(可能是无意的)"temporarily without degrees"

    • search_index() 函数可以选择性地指定一个 search_option 参数。
    • 该选项可以对搜索应用可选转换,如下所示:1=词干搜索应用词干匹配词或短语基于他们的词干形式。2=分解搜索将分解应用于复合词。3=模糊搜索将指定的模糊程度(字符差异的数量)应用于搜索。4=正则表达式搜索允许使用 RegEx 匹配进行搜索。这个示例指定了默认值 0,意味着没有搜索转换。
    • Search_index() 函数可以选择性地指定一个 search_language 参数。您可以指定一种语言,或指定'*'来调用自动语言识别,支持搜索包含多种语言的文本。这个示例指定默认值'en'(英语)

这个示例还通过将相同的 search_item 应用于返回的记录来突出显示返回的文本。这通过使用 <b> </b> 标签为它们定界来突出这两个短语的每一个实例。

提供这个示例是为了让您初步体验 InterSystems IRIS SQL 搜索。您不应该将这个示例作为开发真正的应用程序的基础。要在实际情况下使用 SQL 搜索,您应该充分研究软件提供的可用选择,然后开发您的应用程序以创建健全和高效的代码。

  1. 了解有关 SQL 搜索的更多信息

InterSystems 还有其他参考资料可以帮助您了解有关 SQL 搜索的更多信息,包括:

  • Using InterSystems SQL Search(《使用 InterSystems SQL 搜索》)