• elasticsearch操作


    1.倒排索引的介绍

    1. 1 倒排索引:对文章进行分词,对每个词建立索引,
    2. 由于这样建,会出现索引爆炸,索引索引跟标题建关系,标题再跟文章建索引,如下:
    3. 分词---文章建立索引 |
    4. | 今天(索引) | (文章1,<210>,2) (文章3,<8>,1) |
    5. | 星期天(索引) | (文章2,<12,25,100>,3) |
    6. | 出去玩(索引) | (文章5,<11,24,89>,3)(文章1,<819>,2) |
    7. 今天出现在哪个文章,出现的位置和出现的次数

    2.索引操作(数据库)

    2.1 创建索引

    1. PUT ymq
    2. {
    3. "settings": {
    4. "index":{
    5. "number_of_shards":5,
    6. "number_of_replicas":1
    7. }
    8. }
    9. }

    2.2 查看索引

    1. # 查看单个
    2. GET ymq/_settings
    3. # 查看所有
    4. GET _all/_settings
    5. # 查看特定
    6. GET ymq,ymq2/_settings
    7. # 查看所有
    8. GET _settings

    2.3 修改索引(一般不太用,只能用来修改副本数量)

    1. #修改索引副本数量为2 分片的数量一开始就要定好
    2. # 副本数量可以改(有可能会出错)
    3. PUT ymq/_settings
    4. {
    5. "number_of_replicas": 2
    6. }
    7. PUT _all/_settings
    8. {
    9. "index": {
    10. "blocks": {
    11. "read_only_allow_delete": false
    12. }
    13. }
    14. }

    2.4 删除索引

    DELETE ymq

    3. 映射管理(类型)(表)

    3.1 介绍

    在Elasticsearch 6.0.0或更高版本中创建的索引只包含一个mapping type。

    在5.x中使用multiple mapping types创建的索引将继续像以前一样在Elasticsearch 6.x中运行。 Mapping types将在Elasticsearch 7.0.0中完全删除

    ##索引如果不创建,只有插入文档,会自动创建

    3.2 创建映射(类型,表)

    1. PUT books
    2. {
    3. "mappings": {
    4. "properties":{
    5. "title":{
    6. "type":"text"
    7. },
    8. "price":{
    9. "type":"integer"
    10. },
    11. "addr":{
    12. "type":"keyword"
    13. },
    14. "company":{
    15. "properties":{
    16. "name":{"type":"text"},
    17. "company_addr":{"type":"text"},
    18. "employee_count":{"type":"integer"}
    19. }
    20. },
    21. "publish_date":{"type":"date","format":"yyy-MM-dd"}
    22. }
    23. }
    24. }

    3.3 查看映射

    1. GET books/_mapping
    2. GET _all/_mapping

    3.4 特殊说明索引映射都不存在,也可以插入文档

    1. PUT ymq2/_doc/1
    2. {
    3. "title":"白雪公主和十个小矮人",
    4. "price":"99",
    5. "addr":"黑暗森里",
    6. "publish_date":"2018-05-19",
    7. "name":"ymq"
    8. }

    4. 文档基本增删查改(一行一行数据)

    4.1 插入文档

    1. PUT books/_doc/1
    2. {
    3. "title":"大头儿子小偷爸爸",
    4. "price":100,
    5. "addr":"北京天安门",
    6. "company":{
    7. "name":"我爱北京天安门",
    8. "company_addr":"我的家在东北松花江傻姑娘",
    9. "employee_count":10
    10. },
    11. "publish_date":"2019-08-19"
    12. }
    13. PUT books/_doc/2
    14. {
    15. "title":"白雪公主和十个小矮人",
    16. "price":"99",
    17. "addr":"黑暗森里",
    18. "publish_date":"2018-05-19"
    19. }
    20. PUT books/_doc/3
    21. {
    22. "title":"白雪公主和十个小矮人",
    23. "price":"99",
    24. "addr":"黑暗森里",
    25. "publish_date":"2018-05-19",
    26. "name":"lqz"
    27. }

    4.2 查看文档

    1. # 格式:索引名称/默认类型名称/id
    2. GET books/_doc/1

    4.3 修改文档两种方式

    4.3.1 第一种(不推荐,全部修改)

    1. PUT lqz/_doc/1
    2. {
    3. "name":"顾老二",
    4. "age":30,
    5. "from": "gu",
    6. "desc": "皮肤黑、武器长、性格直",
    7. "tags": ["黑", "长", "直"]
    8. }

    4.3.2 局部修改

    1. POST lqz/_doc/1/_update
    2. {
    3. "doc": {
    4. "desc": "皮肤很safasdfsda黄,武器很长,性格很直",
    5. "tags": ["很黄","很长", "很直"]
    6. }
    7. }

    4.4 删除文档

    DELETE lqz/_doc/4

    5. 文档查询

    5.1 term与match的区别

    5.1.1 介绍

    term:是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个

    match:查询会先对搜索词进行分词,分词完毕后再逐个对分词结果进行匹配,因此相比于term的精确搜索,match是分词匹配搜索

    5.1.2 创建索引+映射(无ik)+插入数据

    1. # 创建索引跟映射
    2. PUT lqz
    3. {
    4. "settings": {
    5. "number_of_shards": 5,
    6. "number_of_replicas": 2
    7. },
    8. "mappings": {
    9. "properties":{
    10. "title":{
    11. "type":"text"
    12. },
    13. "desc":{
    14. "type":"text"
    15. },
    16. "price":{
    17. "type":"integer"
    18. },
    19. "addr":{
    20. "type":"keyword"
    21. },
    22. "company":{
    23. "properties":{
    24. "name":{"type":"text"},
    25. "company_addr":{"type":"text"},
    26. "employee_count":{"type":"integer"}
    27. }
    28. },
    29. "publish_date":{"type":"date","format":"yyy-MM-dd"}
    30. }
    31. }
    32. }
    33. # 插入数据
    34. PUT lqz/_doc/1
    35. {
    36. "title":"so beautiful zero",
    37. "price":100,
    38. "addr":"北京天安门",
    39. "desc":"beautiful cat",
    40. "company":{
    41. "name":"我爱北京天安门",
    42. "company_addr":"我的家在东北松花江傻姑娘",
    43. "employee_count":10
    44. },
    45. "publish_date":"2019-08-19"
    46. }
    47. PUT lqz/_doc/2
    48. {
    49. "title":"so beautiful one",
    50. "price":200,
    51. "addr":"北京天安门",
    52. "desc":"beautiful dog",
    53. "company":{
    54. "name":"我爱北京天安门",
    55. "company_addr":"我的家在东北松花江傻姑娘",
    56. "employee_count":10
    57. },
    58. "publish_date":"2019-08-19"
    59. }
    60. PUT lqz/_doc/3
    61. {
    62. "title":"so beautiful tow",
    63. "price":698,
    64. "addr":"北京天安门",
    65. "desc":"dog",
    66. "company":{
    67. "name":"我爱北京天安门",
    68. "company_addr":"我的家在东北松花江傻姑娘",
    69. "employee_count":10
    70. },
    71. "publish_date":"2019-08-19"
    72. }

    5.2 term

    5.2.1 term与terms

    term:不会分词,按照指定的词查询

    terms:可指定多个词查询

    1. # term查的不会分词
    2. GET lqz/_doc/_search
    3. {
    4. "query": {
    5. "term": {
    6. "desc": "beautiful"
    7. }
    8. }
    9. }
    10. # terms由于部分词,想查多个,terms
    11. GET lqz/_doc/_search
    12. {
    13. "query": {
    14. "terms": {
    15. "title": ["beautiful", "so"]
    16. }
    17. }
    18. }

    5.3 match

    5.3.1 match和match_all

    match:查询相当于模糊匹配,只包含其中一部分关键词就行 

    match_all:能够匹配索引中的所有文件。 

    match_phrase:短语匹配查询,要求必须全部精确匹配,且顺序必须与指定的短语相同

    1. # match查的短语会分词
    2. GET lqz/_doc/_search
    3. {
    4. "query": {
    5. "match_all": {}
    6. }
    7. }
    8. GET lqz/_doc/_search
    9. {
    10. "query": {
    11. "match": {
    12. "title": "beautiful tow"
    13. }
    14. }
    15. }

    5.4 排序查询

    不是所有字段都支持排序,只有数字类型,字符串不支持

    1. # 排序查询
    2. # 1.普通查询
    3. GET lqz/_doc/_search
    4. {
    5. "query": {
    6. "match": {
    7. "addr": "北京天安门"
    8. }
    9. }
    10. }
    11. # 2.降序
    12. GET lqz/_doc/_search
    13. {
    14. "query": {
    15. "match": {
    16. "addr": "北京天安门"
    17. }
    18. },
    19. "sort": [
    20. {
    21. "price": {
    22. "order": "desc"
    23. }
    24. }
    25. ]
    26. }
    27. #3.升序
    28. GET lqz/_doc/_search
    29. {
    30. "query": {
    31. "match": {
    32. "addr": "北京天安门"
    33. }
    34. },
    35. "sort": [
    36. {
    37. "price": {
    38. "order": "asc"
    39. }
    40. }
    41. ]
    42. }
    43. # 4.match_all+升序
    44. GET lqz/_doc/_search
    45. {
    46. "query": {
    47. "match_all": {
    48. }
    49. },
    50. "sort": [
    51. {
    52. "price": {
    53. "order": "asc"
    54. }
    55. }
    56. ]
    57. }

    5.5 分页查询

    所有的条件都是可插拔的,彼此之间用 , 分割

    1. # 分页
    2. #从第二条开始,取一条
    3. GET lqz/_doc/_search
    4. {
    5. "query": {
    6. "match_all": {}
    7. },
    8. "sort": [
    9. {
    10. "price": {
    11. "order": "desc"
    12. }
    13. }
    14. ],
    15. "from": 2,
    16. "size": 2
    17. }
    18. ###注意:对于`elasticsearch`来说,所有的条件都是可插拔的,彼此之间 , 分割
    19. GET lqz/_doc/_search
    20. {
    21. "query": {
    22. "match_all": {}
    23. },
    24. "from": 2,
    25. "size": 2
    26. }

    5.6 布尔查询

    • must:与关系,相当于关系型数据库中的and

    • should:或关系,相当于关系型数据库中的or

    • must_not:非关系,相当于关系型数据库中的not

    • filter:过滤条件。

    • range:条件筛选范围。

    • gt:大于,相当于关系型数据库中的>

    • gte:大于等于,相当于关系型数据库中的>=

    • lt:小于,相当于关系型数据库中的<

    • lte:小于等于,相当于关系型数据库中的<=

    1. ##布尔查询之should or条件
    2. GET lqz/_doc/_search
    3. {
    4. "query": {
    5. "bool": {
    6. "should": [
    7. {
    8. "match": {
    9. "addr": "北京天安门"
    10. }
    11. },
    12. {
    13. "match": {
    14. "desc": "beautiful"
    15. }
    16. }
    17. ]
    18. }
    19. }
    20. }
    21. ### must_not条件 都不是
    22. GET lqz/_doc/_search
    23. {
    24. "query": {
    25. "bool": {
    26. "must_not": [
    27. {
    28. "match": {
    29. "addr": "北京天安门"
    30. }
    31. },
    32. {
    33. "match": {
    34. "desc": "beautiful"
    35. }
    36. },
    37. {
    38. "match": {
    39. "price": 698
    40. }
    41. }
    42. ]
    43. }
    44. }
    45. }
    46. ###filter,大于小于的条件 gt lt gte lte
    47. GET lqz/_doc/_search
    48. {
    49. "query": {
    50. "bool": {
    51. "must": [
    52. {
    53. "match": {
    54. "addr": "北京天安门"
    55. }
    56. }
    57. ],
    58. "filter": {
    59. "range": {
    60. "price": {
    61. "lt": 200
    62. }
    63. }
    64. }
    65. }
    66. }
    67. }
    68. ### 范围查询
    69. GET lqz/_doc/_search
    70. {
    71. "query": {
    72. "bool": {
    73. "must": [
    74. {
    75. "match": {
    76. "addr": "北京天安门"
    77. }
    78. }
    79. ],
    80. "filter": {
    81. "range": {
    82. "price": {
    83. "gte": 100,
    84. "lte": 150
    85. }
    86. }
    87. }
    88. }
    89. }
    90. }

    5.7 查询结果过滤

    1. ###基本使用
    2. GET lqz/_doc/_search
    3. {
    4. "query": {
    5. "match_all": {
    6. }
    7. },
    8. "_source":["name","age"]
    9. }
    10. ####_source和query是平级的
    11. GET lqz/_doc/_search
    12. {
    13. "query": {
    14. "bool": {
    15. "must":{
    16. "match":{"from":"gu"}
    17. },
    18. "filter": {
    19. "range": {
    20. "age": {
    21. "lte": 25
    22. }
    23. }
    24. }
    25. }
    26. },
    27. "_source":["name","age"]
    28. }

    5.8 高亮查询(未能高亮)

    1. GET lqz/_doc/_search
    2. {
    3. "query": {
    4. "match": {
    5. "price": "698"
    6. }
    7. },
    8. "highlight": {
    9. "pre_tags": "",
    10. "post_tags": "",
    11. "fields": {
    12. "from": {}
    13. }
    14. }
    15. }

    5.9 聚合函数

    1. # sum ,avg, max ,min
    2. # select max(age) as my_avg from 表 where from=gu;
    3. GET lqz/_doc/_search
    4. {
    5. "query": {
    6. "match": {
    7. "from": "gu"
    8. }
    9. },
    10. "aggs": {
    11. "my_avg": {
    12. "avg": {
    13. "field": "age"
    14. }
    15. }
    16. },
    17. "_source": ["name", "age"]
    18. }
    19. #最大年龄
    20. GET lqz/_doc/_search
    21. {
    22. "query": {
    23. "match": {
    24. "from": "gu"
    25. }
    26. },
    27. "aggs": {
    28. "my_max": {
    29. "max": {
    30. "field": "age"
    31. }
    32. }
    33. },
    34. "_source": ["name", "age"]
    35. }
    36. #最小年龄
    37. GET lqz/_doc/_search
    38. {
    39. "query": {
    40. "match": {
    41. "from": "gu"
    42. }
    43. },
    44. "aggs": {
    45. "my_min": {
    46. "min": {
    47. "field": "age"
    48. }
    49. }
    50. },
    51. "_source": ["name", "age"]
    52. }
    53. # 总年龄
    54. #最小年龄
    55. GET lqz/_doc/_search
    56. {
    57. "query": {
    58. "match": {
    59. "from": "gu"
    60. }
    61. },
    62. "aggs": {
    63. "my_sum": {
    64. "sum": {
    65. "field": "age"
    66. }
    67. }
    68. },
    69. "_source": ["name", "age"]
    70. }
    71. #分组
    72. # 现在我想要查询所有人的年龄段,并且按照`15~20,20~25,25~30`分组,并且算出每组的平均年龄。
    73. GET lqz/_doc/_search
    74. {
    75. "size": 0,
    76. "query": {
    77. "match_all": {}
    78. },
    79. "aggs": {
    80. "age_group": {
    81. "range": {
    82. "field": "age",
    83. "ranges": [
    84. {
    85. "from": 15,
    86. "to": 20
    87. },
    88. {
    89. "from": 20,
    90. "to": 25
    91. },
    92. {
    93. "from": 25,
    94. "to": 30
    95. }
    96. ]
    97. }
    98. }
    99. }
    100. }
    
                    
  • 相关阅读:
    第一章 教育基础(07 心理学基础知识)
    详细讲解什么是单例模式
    获取sku详细信息 API 返回值说明
    《MySQL学习笔记》数据库增删查改(进阶)
    1、Html编程基础
    内蒙古自治区工程系列建设工程专业技术人才职称评审条件
    JVM【八股文】
    视频剪辑中花式抠图的代码实操与案例详述
    C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗
    Python基础——异常处理
  • 原文地址:https://blog.csdn.net/qq_52385631/article/details/126374769