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中被索引的;

posted @ 2016-09-19 20:47  zhangshihai1232  阅读(152)  评论(0)    收藏  举报