当前位置:   article > 正文

ElasticSearch从入门到精通_elasticsearch 精通

elasticsearch 精通

目录

一.ElasticSearch基本介绍

1.ElasticSearch简介

2.Elasticsearch特点

3.Elasticsearch中的基本概念

4.倒排索引

 二.ElasticSearch查询语法

1.基础查询

(1)查询所有酒店信息match_all

(2)分页查询酒店列表from,size

(3)精确搜索term(相当于=),terms(相当于in)

(4)分词搜索:酒店名称分词查询match(单字段)multi_match(多字段)

(5)模糊搜索:酒店品牌模糊搜索wildcard

(6)多字段搜索query_string

(7)排序sort

(8)范围搜索range

(9)自动纠错搜索

(10)高亮搜索

(11)指定查询哪些字段 _source

2.bool查询

(1)must

(2)filter

(3)must和filter组合

3.聚合查询

(1)指标聚合aggs

(2)桶聚合aggs

4.优化多字段查询

(1)提升字段查询得分

(2)综合提升字段查询得分

(3)自定义评分


一.ElasticSearch基本介绍

1.ElasticSearch简介

        Elasticsearch是实时的分布式搜索分析引擎,内部使用Lucene做索引与搜索

2.Elasticsearch特点

(1)准实时性:新增到 ES 中的数据在1秒后就可以被检索到,这种新增数据对搜索的可见性称为“准实时搜索”
(2)分布式:意味着可以动态调整集群规模,弹性扩容
(3)集群规模:可以扩展到上百台服务器,处理PB级结构化或非结构化数据
(4)各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作

3.Elasticsearch中的基本概念

(1)索引(Index)
        相比传统的关系型数据库,索引相当于SQL中的一个【数据库】
(2)类型(Type)
        一个索引内部可以定义一个或多个类型, 在传统关系数据库来说, 类型相当于【表】的概念。
        注意:ES7之后Type被舍弃,只有Index(等同于数据库+表定义)和Document(文档,行记录)。
(3)文档(Document)
        采用JSON格式表示。相当于传统数据库【行】概念。

4.倒排索引

而ElasticSearch为了提升查询效率,采用反向思维方式,根据value找key。这就是倒排索引。

 二.ElasticSearch查询语法

1.基础查询

(1)查询所有酒店信息match_all

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

(2)分页查询酒店列表from,size

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "from": 0,
  7. "size": 5
  8. }

(3)精确搜索term(相当于=),terms(相当于in)

        案例1:term 展示出"万豪"品牌下的所有酒店信息

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "term": {
  5. "brand": "万豪"
  6. }
  7. }
  8. }

        案例2:terms 展示出"万豪"和“如家”品牌下的所有酒店信息

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "terms": {
  5. "brand": ["万豪","如家"]
  6. }
  7. }
  8. }

(4)分词搜索:酒店名称分词查询match(单字段)multi_match(多字段)

  1. //单字段
  2. GET hotel/_search
  3. {
  4. "query": {
  5. "match": {
  6. "name": "北京市东城区瑞麟湾酒店"
  7. }
  8. }
  9. }
  10. //多字段
  11. GET hotel/_search
  12. {
  13. "query": {
  14. "match": {
  15. "query": "北京市东城区瑞麟湾酒店",
  16. "fields": ["name","title"]
  17. }
  18. }
  19. }

(5)模糊搜索:酒店品牌模糊搜索wildcard

  1. //wildcard:不会对查询条件进行分词。还可以使用通配符 ?(任意单个字符) 和 *0个或多个字符)
  2. GET hotel/_search
  3. {
  4. "query": {
  5. "wildcard": {
  6. "brand": "万*"
  7. }
  8. }
  9. }

(6)多字段搜索query_string

  1. //可以指定多个域、会对搜索条件分词、将分词后的搜索条件与term匹配、取结果并集OR、交集AND
  2. GET hotel/_search
  3. {
  4. "query": {
  5. "query_string": {
  6. "fields": ["name", "address", "area", "synopsis"],
  7. "query": "spa OR 商务"
  8. }
  9. }
  10. }

(7)排序sort

  1. //根据salesVolume升序排
  2. GET hotel/_search
  3. {
  4. "sort": {
  5. "salesVolume": {
  6. "order": "asc"
  7. }
  8. }
  9. }

(8)范围搜索range

  1. //range: gt 大于、gte 大于等于、 lt 小于、lte 小于等于
  2. GET hotel/_search
  3. {
  4. "query": {
  5. "range": {
  6. "price": {
  7. "gte": 600,
  8. "lt": 1600
  9. }
  10. }
  11. }
  12. }

(9)自动纠错搜索

  1. //fuzzyQuery:自动尝试将条件纠错,并和词条匹配、fuzziness 允许对几个字进行纠错、prefix_length //设置前几个字符不允许编辑
  2. //在未经处理的情况下,一旦条件存在错别字,找不到term,则无法查询到结果
  3. ## 正常搜索
  4. GET hotel/_search
  5. {
  6. "query": {
  7. "term": {
  8. "area": "北京市"
  9. }
  10. }
  11. }
  12. ## 错别字 经
  13. GET hotel/_search
  14. {
  15. "query": {
  16. "term": {
  17. "area": "北经市"
  18. }
  19. }
  20. }
  21. ## 自动纠错搜索 经
  22. GET hotel/_search
  23. {
  24. "query": {
  25. "fuzzy": {
  26. "area": {
  27. "fuzziness": 1,
  28. "prefix_length": 1,
  29. "value": "北经市"
  30. }
  31. }
  32. }
  33. }

(10)高亮搜索

  1. //highlight:如需将搜索条件以高亮形式展示,则需要在查询时,设置需要对哪一个域以何种样式进行展示,fields 设置要对哪个域高亮、pre_tags 设置高亮样式前缀、post_tags 设置高亮样式后缀。
  2. GET hotel/_search
  3. {
  4. "query": {
  5. "term": {
  6. "name": "新乐"
  7. }
  8. },
  9. "highlight": {
  10. "fields": {
  11. "name": {
  12. "pre_tags": "<font color='red'>",
  13. "post_tags": "</font>"
  14. }
  15. }
  16. }
  17. }

(11)指定查询哪些字段 _source

  1. //展示那么和price字段
  2. GET hotel/_search
  3. {
  4. "query": {
  5. "term": {
  6. "brand": "万豪"
  7. }
  8. },
  9. "_source": ["name","price"],
  10. }
  11. //有以下连个可选项
  12. includes:来指定想要显示的字段
  13. excludes:来指定不想要显示的字段
  14. GET hotel/_search
  15. {
  16. "_source": {
  17. "includes":["title","price"]
  18. },
  19. "query": {
  20. "term": {
  21. "price": 2699
  22. }
  23. }
  24. }

2.bool查询

        must(and)条件必须成立
        must_not (not)条件必须不成立
        should(or)条件可以成立
        filter (and)条件过滤,必须成立,但是不予评分

(1)must

        must单独使用 品牌必须是万豪,地区必须是北京市

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "term": {
  8. "brand": "万豪"
  9. }
  10. },{
  11. "term": {
  12. "area": "北京市"
  13. }
  14. }
  15. ]
  16. }
  17. }
  18. }

(2)filter

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "filter": [
  6. {
  7. "term": {
  8. "brand": "万豪"
  9. }
  10. },{
  11. "term": {
  12. "area": "北京市"
  13. }
  14. }
  15. ]
  16. }
  17. }
  18. }

(3)must和filter组合

  1. ## must和filter组合使用 品牌为万豪下的,地区为北京市、价格范围在5002000之间的酒店
  2. GET hotel/_search
  3. {
  4. "query": {
  5. "bool": {
  6. "must": [
  7. {
  8. "term": {
  9. "brand": "万豪"
  10. }
  11. }
  12. ],
  13. "filter": [
  14. {
  15. "term": {
  16. "area": "北京市"
  17. }
  18. },{
  19. "range": {
  20. "price": {
  21. "gte": 500,
  22. "lte": 2000
  23. }
  24. }
  25. }
  26. ]
  27. }
  28. }
  29. }

3.聚合查询

ES中的聚合搜索分为两类:
        指标聚合:如max、min、sum等。作用等同MySQL中相关聚合函数
        桶聚合:用于数据分组,作用等同于MySQL中的group by

(1)指标聚合aggs

        统计品牌为万豪下最贵酒店价格

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "term": {
  5. "brand": "万豪"
  6. }
  7. },
  8. "aggs": {
  9. "my_max_price": {
  10. "max": {
  11. "field": "price"
  12. }
  13. }
  14. }
  15. }

(2)桶聚合aggs

        案例1:统计品牌为万豪下有哪些星级

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "term": {
  5. "brand": "万豪"
  6. }
  7. },
  8. "aggs": {
  9. "my_group": {
  10. "terms": {
  11. "field": "specs",
  12. "size": 5
  13. }
  14. }
  15. }
  16. }

        案例2:根据搜索条件对品牌分组

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "query_string": {
  5. "fields": ["name", "synopsis", "area", "address"],
  6. "query": "三亚 OR 商务"
  7. }
  8. },
  9. "aggs": {
  10. "hotel_brand": {
  11. "terms": {
  12. "field": "brand",
  13. "size": 100
  14. }
  15. }
  16. }
  17. }

        案例3:统计某品牌下酒店指定时间段内的销量

  1. GET hotel/_search
  2. {
  3. "query": {
  4. "range": {
  5. "createTime": {
  6. "gte": "2016-01-01",
  7. "lte": "2021-01-01"
  8. }
  9. }
  10. },
  11. "aggs": {
  12. "hotel_brand": {
  13. "terms": {
  14. "field": "brand",
  15. "size": 100
  16. },
  17. "aggs": {
  18. "sale_count": {
  19. "sum": {
  20. "field": "salesVolume"
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }

4.优化多字段查询

        搜索时,对于每条搜索结果ES都会对其按照匹配度进行打分,分数越高,在结果中排名越靠前。
        在ES中提供了以下两种设置权重的方式:
        (1)索引设置:创建索引时配置权重,该方式应用较少,因为一旦需求发生改变,则需要重新创建索引。
        (2)查询设置:在查询时,根据需求灵活的配置权重,该方式使用最多。

(1)提升字段查询得分

        将name字段查询比重提升10倍

  1. GET hotel/_search
  2. {
  3. "explain": true,
  4. "query":{
  5. "multi_match":{
  6. "query": "北京金龙",
  7. "fields": ["name^10", "address"]
  8. }
  9. }
  10. }

(2)综合提升字段查询得分

        tie_breaker:将其他query的分数也考虑进去(最大值加上其他值的0.3倍)

  1. GET hotel/_search
  2. {
  3. "explain": true,
  4. "query":{
  5. "multi_match":{
  6. "query": "北京金龙",
  7. "fields": ["name", "address"],
  8. "tie_breaker": 0.3
  9. }
  10. }
  11. }
  12. 使用 tie_breaker 和不使用tie_breaker ,查询出来的某一条数据的 _score 分数,会有相应的提高,例如:
  13. name中包含关键词matched query 的得分,假设是 0.1984226
  14. address中包含关键词matched query的得分,假设是 12.07466
  15. 添加了 tie_breaker = 0.3,那么就是这样的了, 0.1984226 * 0.3 + 12.07466 = 12.13418678
  16. 大于最高一条的得分12.07466,这样搜索的关联性就提升上去了, 更为合理。

(3)自定义评分

  1. 1.创建索引时设置权重
  2. ## 查询多域展示相关结果数据
  3. GET hotel/_search
  4. {
  5. "query": {
  6. "query_string": {
  7. "fields": ["name", "synopsis", "area", "address"],
  8. "query": "北京市万豪spa三星"
  9. }
  10. }
  11. }
  12. ## 评分扩大10
  13. GET hotel/_search
  14. {
  15. "query": {
  16. "query_string": {
  17. "fields": ["name", "synopsis", "area", "address"],
  18. "query": "北京市万豪spa三星",
  19. "boost": 10
  20. }
  21. }
  22. }
  23. 2.查询时设置权重(function_score)
  24. ## 为品牌为万豪的酒店,权重值增加50
  25. GET hotel/_search
  26. {
  27. "query": {
  28. "function_score": {
  29. "query": {
  30. "query_string": {
  31. "fields": ["name", "synopsis", "area", "address"],
  32. "query": "北京市万豪spa三星"
  33. }
  34. },
  35. "functions": [
  36. {
  37. "filter": {
  38. "term": {
  39. "brand": "万豪"
  40. }
  41. },
  42. "weight": 50
  43. }
  44. ]
  45. }
  46. }
  47. }
  48. ## 将广告酒店的权重增加100倍,使其靠前
  49. GET hotel/_search
  50. {
  51. "query": {
  52. "function_score": {
  53. "query": {
  54. "query_string": {
  55. "fields": ["name", "synopsis", "area", "address"],
  56. "query": "北京市万豪spa三星"
  57. }
  58. }
  59. }
  60. }
  61. }
  62. GET hotel/_search
  63. {
  64. "query": {
  65. "function_score": {
  66. "query": {
  67. "query_string": {
  68. "fields": ["name", "synopsis", "area", "address"],
  69. "query": "北京市万豪spa三星"
  70. }
  71. },
  72. "functions": [
  73. {
  74. "filter": {
  75. "term": {
  76. "isAd": "1"
  77. }
  78. },
  79. "weight": 100
  80. }
  81. ]
  82. }
  83. }
  84. }

更多查询语法请见这篇文章:es 模糊查询_jojoRey的博客-CSDN博客_es模糊查询

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/494128
推荐阅读
相关标签
  

闽ICP备14008679号