CURD

增加与修改

  1. POST twitter/doc/1
  2. {
  3. "name":"jack",
  4. "age":30
  5. }
  1. $ curl -H 'Content-Type: application/json' http://localhost:9200/twitter/doc/1?pretty -d '{"name":"jack","age":30}'

按文档查询

  1. GET twitter/doc/1
  1. $ curl http://localhost:9200/twitter/doc/1?pretty

修改

全部修改

  1. PUT twitter/doc/1
  2. {
  3. "name":"jack",
  4. "age":35
  5. }
  1. $ curl -XPUT -H 'Content-Type: application/json' http://localhost:9200/twitter/doc/1?pretty -d '{"name":"jack","age":35}'

部分修改

  1. POST twitter/doc/1/_update
  2. {
  3. "doc" : {
  4. "name" : "mark"
  5. }
  6. }
  1. $ curl -H 'Content-Type: application/json' http://localhost:9200/twitter/doc/1/_update?pretty -d '{"doc":{"name":"mark"}}'

删除

  1. DELETE twitter/doc/1
  1. $ curl -XDELETE http://localhost:9200/twitter/doc/1?pretty

高级搜索

先增加一点数据

  1. POST twitter/doc/1
  2. {
  3. "name":"jack",
  4. "age":30
  5. }
  6. POST twitter/doc/2
  7. {
  8. "name":"mark",
  9. "age":35
  10. }

通过名称来查询:

  1. GET twitter/_search?q=jack
  2. # OR
  3. GET twitter/_search?q=35
  1. $ curl http://localhost:9200/twitter/_search?q=jack&pretty=true
  2. $ curl http://localhost:9200/twitter/_search?q=35&pretty=true

上述 GET twitter/_search?q=jack 的 Response Body:

  1. {
  2. "took": 51,
  3. "timed_out": false,
  4. "_shards": {
  5. "total": 5,
  6. "successful": 5,
  7. "skipped": 0,
  8. "failed": 0
  9. },
  10. "hits": {
  11. "total": 1,
  12. "max_score": 0.2876821,
  13. "hits": [
  14. {
  15. "_index": "twitter",
  16. "_type": "doc",
  17. "_id": "1",
  18. "_score": 0.2876821,
  19. "_source": {
  20. "name": "jack",
  21. "age": 30
  22. }
  23. }
  24. ]
  25. }
  26. }

hits 就是我们搜索返回的结果,total 是搜索命中的结果总数,下面的 hits 是本次返回的部分搜索结果,是一个数组结构,里面是具体的索引文档

还能限定查询字段:

  1. GET twitter/_search?q=age:35
  1. $ curl http://localhost:9200/twitter/_search?q=age:35&pretty=true

还能使用 QueryDSL 来写查询表达式:

  1. GET twitter/_search
  2. {
  3. "query": {
  4. "match": {
  5. "age": 35
  6. }
  7. }
  8. }
  1. $ curl -XGET -H 'Content-Type: application/json' http://localhost:9200/twitter/_search?pretty -d '{"query":{"match":{"age":35}}}'

聚合的使用

在使用聚合之前在加一点数据:

  1. POST twitter/doc/3
  2. {
  3. "name":"john",
  4. "age":30
  5. }
  6. POST twitter/doc/4
  7. {
  8. "name":"mark",
  9. "age":40
  10. }

统计年龄的分布情况,可以用下面的查询语句:

  1. GET twitter/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "age_stats": {
  6. "terms": {
  7. "field": "age",
  8. "size": 10
  9. }
  10. }
  11. }
  12. }
  1. $ curl -XGET -H 'Content-Type: application/json' http://localhost:9200/twitter/_search?pretty -d '{"size":0, "aggs": {"age_stats": {"terms": {"field": "age", "size": 10}}}}'

最外层的 size0 这样可以不返回搜索命中的文档,只返回聚合的统计结果,aggs 就是我们描述聚合查询语句根节点,我们使用 terms 聚合类型来对 age 字段的值进行统计,并且只返回前 10 个统计值,然后这些统计结果我们命名为 age_stats

上述的返回结果:

  1. {
  2. "took" : 2,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 4,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "aggregations": {
  19. "age_stats": {
  20. "doc_count_error_upper_bound": 0,
  21. "sum_other_doc_count": 0,
  22. "buckets": [
  23. {
  24. "key": 30,
  25. "doc_count": 2
  26. },
  27. {
  28. "key": 35,
  29. "doc_count": 1
  30. },
  31. {
  32. "key": 40,
  33. "doc_count": 1
  34. }
  35. ]
  36. }
  37. }
  38. }

可以看到查询返回的 JSON 里面包含了表示聚合结果的 aggregations 节点,下面有我们的统计结果 age_stats,下面 buckets 表示聚合的具体值 key 和统计数据 doc_count,也就是各个年龄分别有多少个文档,出现了多少次。

参考链接

https://elastic-search-in-action.medcl.com/2.basic/elasticsearch_quick_start/