背景:目前国内有大量的公司都在使用 Elasticsearch,包括阿里、京东、滴滴、今日头条、小米、vivo等诸多知名公司。除了搜索功能之外,Elasticsearch还结合Kibana、Logstash、Elastic Stack还被广泛运用在大数据近实时分析领域,包括日志分析、指标监控等多个领域。
本节内容:Elasticsearch精确查询与全文查询。
目录
Elasticsearch中数据可分为两类:精确值查询和全文查询。
1、精确值查询(Exact values)
精确值查询也就是精准查询。例如,我们通常使用到的用户信息查询。精确字段有用户ID、用户名、生日、邮箱地址等。那对于精确值来讲,比如姓名“王二” 和 “王二小” 是不同的,日期2022 和 2022-01-01也是不同的。
精确值查询很容易,结果无非两种:要么匹配、要么不匹配。这种查询很容易用 SQL 表示。
1.1 关系型数据库MYSQL精确查询
SELECT *
FROM user
WHERE name = '王二'
AND user_id = 10001
AND date > '2022-01-01'
1.2 Elasticsearch精确查询
http://127.0.0.1:9200/student/_search?q=name:test9
2、全文查询(Full text)
全文查询是指文本数据,例如一篇博客的内容、一封邮件的内容或者一篇日记内容。全文通常是指非结构化的数据,由于非结构化数据的规则是复杂的,这也导致计算机难以进行正确的解析。
例如,我们看下面这个句子是指的月份还是指的人呢?
May is fun but June bores me(五月很有趣,但六月让我厌烦)。
查询全文数据要比精确查询从语义角度上微妙的多。从语义来看,我们问的不只是“这个文档匹配查询吗”,而是“该文档匹配查询的程度有多大?”,换句话说,也就是该文档与给定查询关键字的相关性如何?一文读懂Elasticsearch强大的排序能力(相关性参考)
在实际业务当中,很少对全文类型的域做精确匹配。反之,更多的是希望在文本类型的域中进行搜索。不仅如此,有时候还希望搜索能够理解我们的意图(有一些人工智能的意思)。
比如:当搜索 UK 时,会返回包含“United Kindom”的文档;当搜索 jump 时,会匹配 jumped , jumps , jumping ,甚至是 leap 。
2.1 关系型数据库MySQL全文搜索
SELECT *
FROM user
WHERE name like '%王二%' -- 模糊查询
2.2 Elasticsearch全文搜索
{
"query" : {
"match" : {
"love" : "rock albums" //匹配带rock albums的文档
}
}
}
为了能够满足在全文域中查询,Elasticsearch 首先需要分析文档。然后,根据分析结果创建倒排索引 。
那倒排索引原理和分析过程的是什么样的呢?我们下篇继续聊。