提到 Ragic 数据库中最快速又最方便的搜索工具,大概就是“全文检索”了!只要输入关键字,就能找到相关的数据。但是,你是不是常遇到“明明输入了关键字,也确定有这个数据,但却搜索不到任何数据”的情况呢?尤其当你的编号都是英数混合的时候,你可能很熟悉这样的情况,例如我有一笔产品数据,产品编号是CHO331343-GERMANY,但如果我在全文检索搜索框中输入“331343”,是怎么样也搜索不到的!
这是为什么呢?今天就来个全文检索运作大泄露,了解之后,你就不会再对这个功能有所误会,也可以更加善用,或甚至是找到更适合你的搜索方式!
Ragic 的全文检索功能并不是由 Ragic 自己发明的搜索发动机所开发的工具,而是采用第三方搜索发动机工具“Lucene”,这是一套用于全文检索和搜索的开放源代码程序库。
无论是像 Google 一样自行开发搜索发动机,或是像 Ragic 这样采用第三方工具,单就“搜索发动机”来看,其实大体系结构上运作逻辑都是相似的。一般来说,搜索发动机会先针对整个数据库中既有的内容,以像是在阅读文章一样的方式,把数据库内容里,每一个系统认定的“字”,做成“索引”(index)——这些创建好的“索引”集结起来,就像一本字典,这个字典会是之后搜索发动机运作的依据。
当你在输入关键字(key word)的时候,搜索发动机实际上做的事,就是从这本字典里,找找看有没有跟关键字一模一样的“索引”,有的话把这个索引所在的那笔数据找出来。没有被做成索引、不在字典里的东西,就不会被叫出来。
系统怎么认定谁是“一个字”,进而决定谁要做成“索引”呢?不同语言的判断逻辑可能就不太一样。以英文来说,由于英文不像中文可以容易的识别出怎样算是“一个字”,很多时候采取的判断基准就会是“空格”,例如“Ragic Database”就会根据中间的空格,被判定是两个字。
而以 Ragic 系统来说,“空格”一样被系统认为是区隔字与字之间的依据,而破折号( - )、英数混合字符串中英文与数字的区隔则不被计算机系统认为是区隔字与字之间的依据,所以“SO-20191219-01”会因为中间没有任何空格,只是破折号,会被看作一个字;“CHO331343”也因为中间没有空格,只是英数字符而不会被拆开看待。
回头来看,如果我的数据内容是像前面案例提到的“CHO331343-GERMANY”,对于系统来说,它一样因为中间没有空格,只有就是“一个字”,不会将“CHO331343”以及“GERMANY”视为两个不同的字,也因此,你要找这个数据时,需要输入完整的内容“CHO331343-GERMANY”来进行搜索,你没有办法只输入片段的内容“CHO331343”或“HO”,或是“331343”,又甚至是“GERMANY”来搜索到你要的内容,因为以上这些片段字符串并没有被创建成索引,存在字典中。
对系统来说,这就像你想找苹果的英文“APPLE”,你是没有办法单用“PP”作为关键字来搜索的,除非你搭配使用正规表示法写条件来输入你的关键字。
这就是为什么假如要搜索产品编号是“CHO331343-GERMANY”的数据,在全文检索输入“331343”就搜索不到的原因——字典里只有“CHO331343-GERMANY”这个索引(字),没有“331343”这个索引(字)。
如果你非得要系统可以在你输入“331343”的时候就找到这个产品编号,你的编号就得单击照计算机系统的规矩来,以空格区分字符串,例如存成“CHO 331343 GERMANY”。
当然,不同的软件,可能会针对各自特定的一些应用及需求,去调整一些细部的判断方式,来决定“怎样算是一个字”。例如, Google 搜索发动机会特别针对英字的复数/时态变化做处理,许多英字不管有没有加“s”,都判断为同一个。
你可能会问,“若无法搜索到‘不完整’的关键字,为什么我在输入关键字、尚未完整输入这个字的同时,系统却知道我可能要打的是什么,出现提示的画面呢?”(如下)
这个是许多检索机制都会提供的功能,我们可以叫它“搜索建议”,目的是根据你现阶段输入的信息,找出包含你可能要输入的“完整关键字”、以及包含可能关键字的相关数据,列在检索栏的下方。
以 Ragic 的全文检索功能来说,会列出三笔“建议关键字”,以及最多五笔“相关数据”(你已输入的信息会被标成红色),目的都是要给你一些提示,让你即使记不得最完整的关键字,也有可能找到你要的数据。只要以鼠标或快捷键点选系统提示的“建议关键字”或“相关数据”,系统就会代替你输入这个完整的关键字,就可以不用自己手动全部打出完整的关键字来才能搜索了!
但是,“搜索建议”并不代表搜索结果,所以,如果在输入到一半、又没有点选搜索建议的情况下,单击到“Enter”(或点放大镜图符)的话,仍然不会看到任何内容。(除非刚好有另一个被建为索引的“字”,正好等于你输入到一半的内容)
以上面的例子来说,输入了“CHO3313”来搜索,在搜索框下方看到了搜索建议,但假如你不点选、直接在这个状态下 Enter 的话,仍然搜索不到任何内容。
另外,出现“搜索建议”的前提是,你所输入的部分字符串,要刚好是从系统中关键字的字首开始打,这样系统才能判断你可能想要输入的内容,进而做出提示。如果是从关键字的中间段开始打,例如要找 “CHO331343-GERMANY” ,你输入 GERMANY 的话,仍然不会因为这样而出现对应的搜索建议喔!
要提醒的是,有时候从“搜索建议”看起来,有时似乎会出现跟上面说明不同的结果——只是输入了关键字的中间段字符串,没有从字首开始,系统似乎就帮我找到关键字并且把中间那一段标号上红色了。例如下图,输入 GERMANY ,搜索建议的相关数据上出现了“CAN331330-GERMANY”为编号的数据,其中“GERMANY”还标成红色。
这其实是系统字符串上色造成的误会。从上图数据来看,实际上系统将某些数据列在搜索建议里,并不是因为这些数据的“编号”字段是“CAN331330-GERMANY”,而是因为这些数据有其他字段(以这里为例,是因为 Country of Origin 这个字段)的字段值刚好是Germany。
只是在显示出结果时,“标号红色”这件事是另一段处理、另一种逻辑,在显示出相关数据时,系统不是依照前面的字首字尾逻辑决定要帮哪些字符串上色,而是会将所有相关数据中跟你输入的字符串 GERMANY 相同的地方都上色,这个部分有时会让一些用户误会了。
你在用 Ragic 的全文检索时可能还会有以下几个需求:
1. 如果我真的只记得片段的字符串怎么办?
那就用用Ragic其他搜索及筛选的工具吧!除了用关键字搜索的全文检索以外,Ragic也有提供表单的左侧搜索以及字段首部搜索,让你可以针对指定的字段做精准的筛选,有需要的话还可以一次针对多个字段下条件。详细的功能说明可以参阅我们的这篇文档。
2. 全文检索有没有支持什么句法,让我可以根据指定的规则一次输入多个关键字来找数据,例如"Chocolate"但不能是"White Chocolate"的数据呢?
Ragic也有支持相关的句法功能!当你在Ragic搜索时,可以写一些搜索列的句法来结合不同的字词,或是使用布尔运算子创建较复杂的查询来找到特定的数据,这与Google的句法相似。详细说明可以参阅我们的这篇文档内容。
3. 全文检索的搜索发动机看起来好像坏掉了,无论怎么搜索都找不到数据?
系统每隔一阵子就会自动帮你重建一次索引,但有可能在你新增数据后没有办法立即找到新的数据,或是可能有其他原因导致搜索发动机没有作用,有需要的话,你也可以手动重建搜索发动机索引来解决此问题。
另外,由于目前全文检索只能搜索表单页的内容,如果在表单页将某个字段设置为隐藏时,即使设置列表页显示该字段,该字段的内容便无法用全文检索搜索到,因此如果找不到数据时,也可以确认一下是否在表单页隐藏了该数据字段。