本节书摘来华章计算机《深入理解Elasticsearch(原书第2版)》一书中的第1章 ,第1.1.3节,[美]拉斐尔·酷奇(Rafal Ku) 马雷克·罗戈任斯基(Marek Rogoziski)著 张世武 余洪淼 商旦 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.1.3 分析数据
读者也许会好奇,文档中的数据是如何转化为倒排索引的?查询串又是怎么转换为可以用于搜索的词项的?这个转换过程被称为分析(analysis)。
文本分析由分析器来执行,它建立在分词器(tokenizer)、过滤器(filter)及字符映射器(character mapper)之上。
Lucene的分词器用来将文本切割成词条,词条是携带各种额外信息的词项,这些信息包括:词项在原始文本中的位置,词项的长度。分词器工作的结果被称为词条流,因为这些词条被一个接一个地推送给过滤器处理。
除了分词器,过滤器也是Lucene分析器的组成部分。过滤器数额可选,可以为零个、一个或多个,用于处理词条流中的词条。例如,它可以移除、修改词条流中的词条,甚至可以创造新的词条。Lucene中有很多现成的过滤器,你也可以根据需要实现新的过滤器。以下是一些过滤器的例子。
小写过滤器:将所有词条转化为小写。
ASCII过滤器:移除词条中所有非ASCII字符。
同义词过滤器:根据同义词规则,将一个词条转化为另一个词条。
多语言词干还原过滤器:将词条的文本部分归约到它们的词根形式,即词干还原。当分析器中有多个过滤器时,会逐个处理,理论上可以有无限多个过滤器。
过滤器可以一个接一个地被调用,因此我们可以通过逐个添加多个过滤器的方式来获得近乎无限的分析能力。
最后我们介绍字符映射器,它用于调用分词器之前的文本预处理操作。字符映射器的一个例子就是HTML文本的去标签处理。
索引与查询
也许读者会好奇,Lucene以及所有基于Lucene的软件是如何控制索引及查询操作的?在索引期,Lucene会使用你选择的分析器来处理文档中的内容,可以对不同的字段使用不同的分析器,例如,文档的title字段与description字段就可以使用不同的分析器。
在检索时,如果你使用了某个查询分析器(query parser),那么你的查询串将会被分析。当然,你也可以选择不分析数据。有一点需要牢记,Elasticsearch中有些查询会被分析,而有些则不会被分析。例如,前缀查询(prefix query)不会被分析,而匹配查询(match query)会被分析。
你还应该记住,索引期与检索期的文本分析要采用同样的分析器,只有查询(query)分词出来的词项与索引中词项能匹配上,才会返回预期的文档集。例如,如果在索引期使用了词干还原与小写转换,那么在查询期,也应该对查询串做相同的处理,否则,查询可能不会返回任何结果。