Elasticsearch 篇之Search API 介绍
search API
1.实现对es中存储的数据进行查询分析,endpoint为_search,如下所示:
curl -uelastic:changeme -XGET http://172.21.30.11:10200/_search
curl -uelastic:changeme -XGET http://172.21.30.11:10200/my_index/_search
curl -uelastic:changeme -XGET http://172.21.30.11:10200/my_index1,my_index1/search
curl -uelastic:changeme -XGET http://172.21.30.11:10200/my*/_search
2.查询主要有两种形式:
- URI Search
- 操作简便,方便通过命令行测试
- 仅包含部分查询语法
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?q=user:zzm -d '
{
"profile":true
}' 可以分析sql语句
q表示查询参数,查询字段user包含zzm的文档
- Request Body Search
- es提供的完备查询语法 Query DSL(Domain Specific Language)
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"term":{"user":"zzm"}
}
}'
- es提供的完备查询语法 Query DSL(Domain Specific Language)
2.1URI SEARCH
- q指定查询的语句
- df q中不指定字段室默认查询的字段,如果不指定,es会查询所有字段
- sort 排序
- timeout 指定超时时间,默认不潮湿
- from,size用于分页
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?q=alfred&df=user&sort=age:asc&from=4&size=10&timeout=1s
查询user字段包含alfred的文档,结果按照age升序排列,返回第5-14个文档,如果超过1s没有结束,则以超时结束
term与phrase
- alfred way等效于alfred OR way
- "alfred way"词语查询,要求先后顺序
泛查询: - alfred 等效于在所有字段去匹配该term
- 指定字段
-name:zzm - Group分组设定,使用括号指定匹配的规则
- (quick OR brown) AND fox
- status:(active OR pending) title:(full text search)
2.2 Request Body Search
- query符合Query DSL 语法的查询语句
- from,size
- timeout
- sort
符合Query DSL 查询语法的查询语句
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"term":{"user":"zzm"}
}
}'
它基于JSON定义的查询语言,主要包含如下两种类型: - 字段类查询
如term,match,range等,只针对某一个字段进行查询- 全文匹配:针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match,match_phrase等query类型
-
match Query
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"match":{
"user":"zzm"
}
}
}'
可以通过operator参数控制单词间的匹配关系,可选项为or和and
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"match":{
"user":{
"query":"zzm",
"operator":"and"
}
}
}
}'
至少匹配2个term
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"match":{
"user":{
"query":"zzm hehe",
"minimum_should_match":"2"
}
}
}
}' -
match phrase Query
对字段作检索,有顺序要求
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"match_phrase":{
"user":"zzm hehe"
}
}
}'
不会返回user中包含zzm aa hehe的记录哦!这里一定要注意。
通过slop参数可以控制单词间的间隔
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"match_phrase":{
"user":{
"query":"zzm",
"slop":"1"
}
}
}
}' -
Query String Query
类似URI Search中的q参数查询
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"query_string":{
"user":{
"default_field":"username",
"query":"alfred AND way"
}
}
}
}'
-
- 单词匹配:不会对查询语句做分词处理,直接去匹配字段的倒排索引,如term,terms,range等query类型
- Term Query
将查询语句作为整个单词进行查询,即不对查询语句做分词处理,如下所示:
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"term":{
"user":"zzm"
}
}
}' - Terms Query
一次传入多个单词进行查询,即不对查询语句做分词处理,如下所示:
curl -uelastic:changeme -XGET http://172.21.30.11:10200/test_index/_search?pretty -d '
{
"query":{
"terms":{
"user":["zzm","hehe"]
}
}
}'
- Term Query
- 全文匹配:针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match,match_phrase等query类型
- 复合查询
如bool查询等,包含一个或多个字段类查询或者复合查询语句
相关性算分:指文档与查询语句间的相关度,英文为relevance
- 通过倒排索引可以获取与查询语句相匹配的文档列表,那么如何将最符合用户查询需求的文档放到前列呢?
- 本质是一个排序问题,排序的依据是相关性算分
- TF 词频:单词在该文档中出现的次数。词频越高,相关度越高
- DF 文档频率:单词出现的文档数
- IDF 逆向文档频率,与文档频率相反,简单理解为1/DF。单词出现的文档数越少,相关度越高
- Field-length Norm 文档越短,相关度越高。
es的算法是按照shard进行的,即shard的分数计算是相互独立的,所以在使用explain的时候注意分片数。