elasticsearnch搜索-基本的工具
搜索-基本的工具
搜索可以实现
- 在类似于gender或者age这样的字段上使用结构化查询,join_date这样的字段上使用排序,就像SQL的结构化查询一样。
- 全文检索,可以使用所有字段来匹配关键字,然后按照关联性(relevance)排序返回结果。
- 或者结合以上两条。
 需要理解三个概念
| 概念 | 解释 | 
|---|---|
| 映射(Mapping) | 数据在每个字段中的解释说明 | 
| 分析(Analysis) | 全文是如何处理的可以被搜索的 | 
| 领域特定语言查询(Query DSL) | Elasticsearch使用的灵活的、强大的查询语言 | 
数据可以在这里找:https://gist.github.com/clintongormley/8579281
一. 空搜索
没有指定任何的查询条件,只返回集群索引中的所有文档:
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
}
total字段来表示匹配到的文档总数
hits数组还包含了匹配到的前10条数据
_source是文档内容
_score是相关性得分
took搜搜话费的时间
shards.total参与查询的分片数,成功失败数
timed_out是否超时,在url中指定超时时间
GET /_search?timeout=10ms
Elasticsearch将返回在请求超时前收集到的结果。
这样超时的任务还会继续执行,并不会中断;
二. 多索引和多类别
空搜索中,不同类型的文档,来自不同的索引;可以限制搜索不同类型的索引或类型;
/_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中搜索 search types user and tweet in all indices
三. 分页
Elasticsearch中的
from默认为10,hits的结果数
size默认为0,从哪个开始显示
可以这样调用
GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10
应该当心分页太深或者一次请求太多的结果,一个索引常涉及多个分片,每个分片生成自己排好序的结果,集中起来排序确保整体正确
深度分页的问题
让我们假设在一个有5个主分片的索引中搜索。当我们请求结果的第一页(结果1到10)时,每个分片产生自己最顶端10个结果然后返回它们给请求节点(requesting node),它再排序这所有的50个结果以选出顶端的10个结果。
现在假设我们请求第1000页——结果10001到10010。工作方式都相同,不同的是每个分片都必须产生顶端的10010个结果。然后请求节点排序这50050个结果并丢弃50040个!
四. 查询字符串
简易搜索
在命令行下运行点对点(ad hoc)查询特别有用
GET /_all/tweet/_search?q=tweet:elasticsearch
下一个语句查找name字段中包含"john"和tweet字段包含"mary"的结果,只需要
+name:john +tweet:mary
编码后
GET /_search?q=%2Bname%3Ajohn+%2Btweet%3Amary
_all字段
例如下面文档
{
    "tweet":    "However did I manage before Elasticsearch?",
    "date":     "2014-09-14",
    "name":     "Mary Jones",
    "user_id":  1
}
类似增加了一个额外的字段_all
"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"
更复杂的语句
下一个搜索推特的语句:
_all field
- name字段包含"mary"或"john"
- date晚于2014-09-10
- _all字段包含"aggregations"或"geo"
+name:(mary john) +date:>2014-09-10 +(aggregations geo)
编码后的查询字符串
?q=%2Bname%3A(mary+john)+%2Bdate%3A%3E2014-09-10+%2B(aggregations+geo)
生产环境我们一般依赖全功能的请求体搜索API,先了解数据是如何在Elasticsearch中被索引的;
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号