持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情
导语
Elasticsearch 是一个分布式的开源搜索和分析引擎,目前被广泛使用,本文记录几种ES常用的搜索方式。
ES搜索
Query string search
以URL参数的形式提供搜索设置:
GET /company/_search? 搜索参数
例如:查看所有文档
GET /company/_search
查看爱好中包含sing的员工并将其按年龄升序排列
GET /company/_search?q=hobby:sing&sort=age:asc
执行结果如下图所示
query DSL
第二种搜索方式叫做query DSL:Domain Specified Language,特定领域的语言,我们将请求的参数放在request body:请求体中,可以用json的格式来构建查询语法,比较方便,可以构建各种复杂的语法,比query string search强大许多。
比如查询全部文档的命令,
GET /company/_search
{
"query": {
"match_all": {}
}
}
再比如,查看爱好中包含sing的员工并将其按年龄升序排列。相比于query string search,这种方式可读性高,功能也很强大,因而最为常用。
# 查看爱好中包含sing的员工并将其按年龄升序排列
GET /company/_search
{
"query": {
"match": {
"hobby": "sing"
}
}
, "sort": [
{
"age": {
"order": "asc"
}
}
]
}
query filter
query filter,是说我们可以在请求中加入过滤项,通过一些布尔逻辑来过滤掉那些我们不想要的文档项。比如下面的例子,就是找出索引的爱好中有sing而且只保留年龄在18到25岁之前的员工就是这样的命令。需要在query中加入bool语句。
GET /company/_search
{
"query": {
"bool": {
"must": [{
"match": {
"hobby": "sing"}
}],
"filter": {
"range": {
"age": {
"gte": 18,
"lte": 25
}
}
}
}}}
full-text search
然后是全文检索这个概念。
全文检索是指对文档执行全文检索,包括单个或多个单词或词组查询,返回匹配条件的搜索结果全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回。
假设我们的四个文档为:
Doc1:"rap"
Doc2:"football basketball sing"
Doc3:"basketball tennis sing"
Doc4:"dance sing rap"
使用查询语句如下:
GET /company/_search
{
"query": {
"match": {
"hobby": "sing football"
}
}
}
其执行结果如下图所示:
全文检索返回的结果中会有一个打分情况,结果也是按照分数由高到低展示的,更多打分的细节可以参考下图(www.jianshu.com/p/bd7a09cef…
phrase search
然后是短语搜索,这个是要求要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,也就是说必须是它的一个子串,才可以算匹配而作为结果返回。
GET /company/_search
{
"query": {
"match_phrase": {
"hobby": "sing rap"
}
}
}
上面的例子只会精准匹配爱好为sing rap的文档作为返回结果,并不会对其进行任何分词。其执行结果如下图所示:
highlight search
最后是高亮搜索,这是一种非常常见的搜索形式。比如我们打开百度,搜索牙膏,就可以看到在所有的搜索结果中,牙膏这两个字就被标红了。比如这里搜索一个sing,使用高亮搜索的方式,搜索结果中,sing被em标签包裹了起来,这是es默认的高亮搜索方式,通过一些参数设置,我们就能改变包裹在sing外面的标签,从而在网页中显示出各种各样的效果。
执行结果如下图所示: