搜索-简单介绍
搜索可以做到什么?
1、在类似与gender
或age
这样的字段上使用结构化查询;join_date
这样的字段上使用排序
2、全文检索,找出所有匹配关键字的文档并按照相关性(relevance)_排序后返回结果
3、以上二者兼而有之
三个重要的概念:
1、映射(Mapping)
:描述数据在每个字段内如何存储
2、分析(Analysis)
:全文是如何处理使之可以被搜索的
3、领域特定查询语言(Query DSL)
:Elasticsearch中强大灵活的查询语言
空搜索
GET /_search
返回的结果
{
"hits" : {
"total" : 14,
"hits" : [
{
"_index": "us",
"_type": "tweet",
"_id": "7",
"_score": 1,
"_source": {
"date": "2014-09-17",
"name": "John Smith",
"tweet": "The Query DSL is really powerful and flexible",
"user_id": 2
}
},
... 9 RESULTS REMOVED ...
],
"max_score" : 1
},
"took" : 4,
"_shards" : {
"failed" : 0,
"successful" : 10,
"total" : 10
},
"timed_out" : false
}
_score
:衡量了文档与查询的匹配程度,默认按_score降序排列
took
:搜索请求耗时,单位毫秒
shards
:查询中参与分片的总数
timeout
:查询是否超时。如果低响应时间比完成结果更重要,可以指定timeout
。
GET /_search?timeout=10ms
需要注意,这里不是停止执行查询,仅仅是告知正在协调的节点返回到目前为止收集的结果并关闭连接。其他的分片可能仍在执行查询即使结果已经被发送了。
多索引,多类型
在一个或多个索引,并且在一个或多个类型中搜索
/_search
:在所有的索引中搜索所有类型
/gb/_search
:在gb
索引中搜索所有类型
/gb,us/_search
:在gb
和us
索引中搜索所有文档
/g*,u*/_search
:在任何以g
或u
开头的索引中搜索所有类型
/gb/user/_search
:在gb
索引中搜索user
类型
/gb,us/user,tweet/_search
:在gb
和us
索引中搜索user
和tweet
类型
/_all/user,tweet/_search
:在所有的索引中搜索user
和tweet
类型
分页
size
:显示应该返回的结果数量,默认是10
from
:显示应该跳过的初始结果数量,默认是0
分页需要跨越多个分片,例如请求第一页,则每个分片排序后产生前10的结果,5个分片共50个结果,协调节点再对50个结果排序,得到前10个。
假如请求第1000页,结果聪10001到10010,然而每个分片都需要产生前10010个结果,还需要排序以及丢弃50040个结果。
在分布式系统中,对结果排序的成本随着深度成指数上升,查询不应该超过1000个结果。
轻量搜索
两种形式的搜索API
1、“轻量的”查询:要求在查询字符串中传递所有的参数
2、“请求体”查询:使用JSON格式和更丰富的查询表达式作为搜索语言
例如:
查询在tweet
类型中tweet
字段包含elasticsearch
单词的所有文档
GET /_all/tweet/_search?q=tweet:elasticsearch
查询在name
字段中包含john
,并且在tweet
字段中包含mary
的文档(需要进行URL编码)
查询参数:+name:john +tweet:mary
完整查询:
GET /_search?q=%2Bname%3Ajohn+%2Btweet%3Amary
+
前缀表示必须与查询条件匹配
-
前缀表示一定不与查询条件匹配
没有+
或-
的条件都是可选的,匹配越多文档越相关。
_all
字段:相当于所有字段拼接成一个名为_all
的额外字段
返回包含mary
的所有文档
GET /_search?q=mary
1、name字段中包含mary或者john
2、date值大于2014-09-10
3、all字段包含aggregations或者geo
+name:(mary john)+date:>2014-09-10+(aggregations geo)
需要进行URL编码
查询字符串搜索允许任何用户在索引的任意字段上执行可能较慢且重量机的查询,可能暴露隐私信息,甚至拖垮集群,因此不推荐直接向用户暴露查询字符串搜索功能
网友评论