Elasticsearch:准确值与全文本
概括地说,Elasticsearch将数据分成两类:准确值(Exact values)和全文本(Full text)。
准确值就是它们听上去的那样。诸如日期或用户ID。当然字符串也可以是准确值,如用户名或邮件地址。准确值Foo与准确值foo是不同的。准确值2014和准确值2014-09-15也是不同的。
另一方面,全文本(full text)指的是通常用人类语言写的文本数据,像一条tweet的文本或一封邮件的内容。
全文本也经常被称为非结构化数据(unstructured data)。这个定义并不十分恰当,因为自然语言是高度结构化的。问题在于自然语言的规则是非常复杂的,以至于计算机很难正确地解析它们。例如以下句子:May is fun but June bores me.
请问,May 和 June到底指的是月份还是人?
准确值非常容易查询。因为它要么匹配查询条件,要么不匹配。像下面这种查询就很容易使用SQL来表达:
WHERE name = "John Smith"
AND user_id = 2
AND date > "2014-09-15"
相对准确值查询,全文查询更为微妙。我们不会只问:“这份文档是否能匹配这次查询”,而是问:“这份文档有多匹配这次查询”。换种说法,这份文档与这次查询有多 相关。
我们很少对整个全文文本字段(full-text field)进行准确匹配。取而代之,我们会想去查询存在里面的文本字段。不过不只这种方式,我们期望搜索引擎能理解我们的意图:
* 当我们搜索UK时,它应该还会返回提到United Kingdom的文档
* 当我们搜索jump时,它应该还会匹配jumped、jumps、jumping,甚至leap
* jhnny walker 应该还会匹配Johnnie Walker。 而johnnie depp应该匹配到Johnny Depp。
* fox news hunting应该返回在Fox News上的关于hunting的故事。而fox hunting news应该返关于fox hunting的新闻。
为了使这种全文搜索更容易,Elasticsearch首先对文本进行分析,然后使用分析结果构建反向索引(inverted index)。接下来的两节,我们将讨论反向索引和这个分析过程。
小结
一开始学习信息检索时,很容易地就认为SQL语句不是完全可以实现搜索功能了么。后来学习到全文检索和反向索引,就明白信息检索背后还需要很多不同的技术来支持,如分词技术、索引、自然语言处理等。
说回来,目前我学习到,使用的都是 “索引”思路来解决搜索问题。那么是不是存在另一些人们不知道的信息检索思路?这里说的索引思路,指的是使用某种方法抽取出待搜索物的特征,查询时,只要与这些特征比较就可以哪些待搜索物匹配查询了。