• 2.1 Elasticsearch DSL搜索-数据准备


    一、数据准备

    • 自定义词库

    •  建立索引dsl_search(名字随意)
    • 手动建立mappings

    POST        /dsl_search/_mapping
    {
        "properties": {
            "id": {
                "type": "long"
            },
            "age": {
                "type": "integer"
            },
            "username": {
                "type": "keyword"
            },
            "nickname": {
                "type": "text",
                "analyzer": "ik_max_word"
            },
            "money": {
                "type": "float"
            },
            "desc": {
                "type": "text",
                "analyzer": "ik_max_word"
            },
            "sex": {
                "type": "byte"
            },
            "birthday": {
                "type": "date"
            },
            "face": {
                "type": "text",
                "index": false
            }
        }
    }

    • 录入数据
      1. POST /dsl_search/_doc/1001
      2. {
      3. "id": 1001,
      4. "age": 18,
      5. "username": "chinanewsAmazing",
      6. "nickname": "中国新闻网",
      7. "money": 88.8,
      8. "desc": "我在中国新闻网到了很多新闻",
      9. "sex": 0,
      10. "birthday": "2022-09-01",
      11. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/527bc4b462d946be81eb900d7c8e63fe.jpg"
      12. }
      13. {
      14. "id": 1002,
      15. "age": 19,
      16. "username": "justbuy",
      17. "nickname": "周杰棍",
      18. "money": 77.8,
      19. "desc": "今天上下班都很堵,车流量很大",
      20. "sex": 1,
      21. "birthday": "1993-01-24",
      22. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      23. }
      24. {
      25. "id": 1003,
      26. "age": 20,
      27. "username": "bigFace",
      28. "nickname": "飞翔的巨鹰",
      29. "money": 66.8,
      30. "desc": "中国新闻网团队和导游坐飞机去海外旅游,去了新马泰和欧洲",
      31. "sex": 1,
      32. "birthday": "1996-01-14",
      33. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      34. }
      35. {
      36. "id": 1004,
      37. "age": 22,
      38. "username": "flyfish",
      39. "nickname": "水中鱼",
      40. "money": 55.8,
      41. "desc": "昨天在学校的池塘里,看到有很多鱼在游泳,然后就去中国新闻网学习了",
      42. "sex": 0,
      43. "birthday": "1988-02-14",
      44. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      45. }
      46. {
      47. "id": 1005,
      48. "age": 25,
      49. "username": "gotoplay",
      50. "nickname": "ps游戏机",
      51. "money": 155.8,
      52. "desc": "今年生日,女友送了我一台play station游戏机,非常好玩,非常不错",
      53. "sex": 1,
      54. "birthday": "1989-03-14",
      55. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      56. }
      57. {
      58. "id": 1006,
      59. "age": 19,
      60. "username": "missimooc",
      61. "nickname": "我叫小髦",
      62. "money": 156.8,
      63. "desc": "我叫髦髦,今年20岁,是一名律师,我在琦䯲星球做演讲",
      64. "sex": 1,
      65. "birthday": "1993-04-14",
      66. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      67. }
      68. {
      69. "id": 1007,
      70. "age": 19,
      71. "username": "msgame",
      72. "nickname": "gamexbox",
      73. "money": 1056.8,
      74. "desc": "明天去进货,最近微软处理很多游戏机,还要买xbox游戏卡带",
      75. "sex": 1,
      76. "birthday": "1985-05-14",
      77. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      78. }
      79. {
      80. "id": 1008,
      81. "age": 19,
      82. "username": "muke",
      83. "nickname": "新闻学习",
      84. "money": 1056.8,
      85. "desc": "大学毕业后,可以到i2.chinanews.com.cn进修",
      86. "sex": 1,
      87. "birthday": "1995-06-14",
      88. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      89. }
      90. {
      91. "id": 1009,
      92. "age": 22,
      93. "username": "shaonian",
      94. "nickname": "骚年轮",
      95. "money": 96.8,
      96. "desc": "骚年在大学毕业后,考研究生去了",
      97. "sex": 1,
      98. "birthday": "1998-07-14",
      99. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      100. }
      101. {
      102. "id": 1010,
      103. "age": 30,
      104. "username": "tata",
      105. "nickname": "隔壁老王",
      106. "money": 100.8,
      107. "desc": "隔壁老外去国外出差,带给我很多好吃的",
      108. "sex": 1,
      109. "birthday": "1988-07-14",
      110. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      111. }
      112. {
      113. "id": 1011,
      114. "age": 31,
      115. "username": "sprder",
      116. "nickname": "皮特帕克",
      117. "money": 180.8,
      118. "desc": "它是一个超级英雄",
      119. "sex": 1,
      120. "birthday": "1989-08-14",
      121. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      122. }
      123. {
      124. "id": 1012,
      125. "age": 31,
      126. "username": "super hero",
      127. "nickname": "super hero",
      128. "money": 188.8,
      129. "desc": "BatMan, GreenArrow, SpiderMan, IronMan... are all Super Hero",
      130. "sex": 1,
      131. "birthday": "1980-08-14",
      132. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
      133. }

    二、入门语法

    请求参数的查询(QueryString)

    查询[字段]包含[内容]的文档

    GET     /dsl_search/_search?q=desc:新闻网
    GET     /dsl_search/_search?q=nickname:新&q=age:25

    text与keyword搜索对比测试(keyword不会被倒排索引,不会被分词)

    GET     /dsl_search/_search?q=nickname:super
    GET     /dsl_search/_search?q=username:super
    GET     /dsl_search/_search?q=username:super hero

    这种方式称之为QueryString查询方式,参数都是放在url中作为请求参数的。

    DSL基本语法

    QueryString查询方式用的很少,因为一旦参数复杂就很难构建,所以大多数查询都会使用dsl来进行查询更好。

    • Domain Specific Language
    • 特定领域语言
    • 基于JSON格式的数据查询
    • 查询更灵活,有利于复杂查询

    DSL格式语法:

    # 查询
    POST     /dsl_search/_search
    {
        "query": {
            "match": {
                "desc": "新闻网"
            }
        }
    }
    # 判断某个字段是否存在
    {
        "query": {
            "exists": {
                "field": "desc"
            }
        }
    }

    • 语法格式为一个json object,内容都是key-value键值对,json可以嵌套。
    • key可以是一些es的关键字,也可以是某个field字段,后面会遇到

    搜索不合法问题定位

    DSL查询的时候经常会出现一些错误查询,出现这样的问题大多数都是json无法被es解析,也会像java一样报一个异常信息,根据异常信息去推断问题所在,比如json格式不对,关键词不存在未注册等等,甚至有时候不能定位问题直接复制错误信息到google里面搜一下就能定位问题了。

    三、查询所有与分页

     match_all

    在索引中查询所有的文档

    GET     /dsl_search/_search

    演示:

    http://192.168.110.129:9200/dsl_search/_search

     结果:

    1. {
    2. "took": 2,
    3. "timed_out": false,
    4. "_shards": {
    5. "total": 3,
    6. "successful": 3,
    7. "skipped": 0,
    8. "failed": 0
    9. },
    10. "hits": {
    11. "total": {
    12. "value": 13,
    13. "relation": "eq"
    14. },
    15. "max_score": 1,
    16. "hits": [
    17. {
    18. "_index": "dsl_search",
    19. "_id": "1002",
    20. "_score": 1,
    21. "_source": {
    22. "id": 1002,
    23. "age": 19,
    24. "username": "justbuy",
    25. "nickname": "周杰棍",
    26. "money": 77.8,
    27. "desc": "今天上下班都很堵,车流量很大",
    28. "sex": 1,
    29. "birthday": "1993-01-24",
    30. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    31. }
    32. },
    33. {
    34. "_index": "dsl_search",
    35. "_id": "1003",
    36. "_score": 1,
    37. "_source": {
    38. "id": 1003,
    39. "age": 20,
    40. "username": "bigFace",
    41. "nickname": "飞翔的巨鹰",
    42. "money": 66.8,
    43. "desc": "中国新闻网团队和导游坐飞机去海外旅游,去了新马泰和欧洲",
    44. "sex": 1,
    45. "birthday": "1996-01-14",
    46. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    47. }
    48. },
    49. {
    50. "_index": "dsl_search",
    51. "_id": "1007",
    52. "_score": 1,
    53. "_source": {
    54. "id": 1007,
    55. "age": 19,
    56. "username": "msgame",
    57. "nickname": "gamexbox",
    58. "money": 1056.8,
    59. "desc": "明天去进货,最近微软处理很多游戏机,还要买xbox游戏卡带",
    60. "sex": 1,
    61. "birthday": "1985-05-14",
    62. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    63. }
    64. },
    65. {
    66. "_index": "dsl_search",
    67. "_id": "1008",
    68. "_score": 1,
    69. "_source": {
    70. "id": 1008,
    71. "age": 19,
    72. "username": "muke",
    73. "nickname": "新闻学习",
    74. "money": 1056.8,
    75. "desc": "大学毕业后,可以到i2.chinanews.com.cn进修",
    76. "sex": 1,
    77. "birthday": "1995-06-14",
    78. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    79. }
    80. },
    81. {
    82. "_index": "dsl_search",
    83. "_id": "1011",
    84. "_score": 1,
    85. "_source": {
    86. "id": 1011,
    87. "age": 31,
    88. "username": "sprder",
    89. "nickname": "皮特帕克",
    90. "money": 180.8,
    91. "desc": "它是一个超级英雄",
    92. "sex": 1,
    93. "birthday": "1989-08-14",
    94. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    95. }
    96. },
    97. {
    98. "_index": "dsl_search",
    99. "_id": "_search",
    100. "_score": 1,
    101. "_source": {
    102. "query": {
    103. "match": {
    104. "desc": "新闻网"
    105. }
    106. }
    107. }
    108. },
    109. {
    110. "_index": "dsl_search",
    111. "_id": "1001",
    112. "_score": 1,
    113. "_source": {
    114. "id": 1001,
    115. "age": 18,
    116. "username": "chinanewsAmazing",
    117. "nickname": "中国新闻网",
    118. "money": 88.8,
    119. "desc": "我在中国新闻网到了很多新闻",
    120. "sex": 0,
    121. "birthday": "2022-09-01",
    122. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/527bc4b462d946be81eb900d7c8e63fe.jpg"
    123. }
    124. },
    125. {
    126. "_index": "dsl_search",
    127. "_id": "1004",
    128. "_score": 1,
    129. "_source": {
    130. "id": 1004,
    131. "age": 22,
    132. "username": "flyfish",
    133. "nickname": "水中鱼",
    134. "money": 55.8,
    135. "desc": "昨天在学校的池塘里,看到有很多鱼在游泳,然后就去中国新闻网学习了",
    136. "sex": 0,
    137. "birthday": "1988-02-14",
    138. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    139. }
    140. },
    141. {
    142. "_index": "dsl_search",
    143. "_id": "1005",
    144. "_score": 1,
    145. "_source": {
    146. "id": 1005,
    147. "age": 25,
    148. "username": "gotoplay",
    149. "nickname": "ps游戏机",
    150. "money": 155.8,
    151. "desc": "今年生日,女友送了我一台play station游戏机,非常好玩,非常不错",
    152. "sex": 1,
    153. "birthday": "1989-03-14",
    154. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    155. }
    156. },
    157. {
    158. "_index": "dsl_search",
    159. "_id": "1006",
    160. "_score": 1,
    161. "_source": {
    162. "id": 1006,
    163. "age": 19,
    164. "username": "missimooc",
    165. "nickname": "我叫小髦",
    166. "money": 156.8,
    167. "desc": "我叫髦髦,今年20岁,是一名律师,我在琦䯲星球做演讲",
    168. "sex": 1,
    169. "birthday": "1993-04-14",
    170. "face": "https://i2.chinanews.com.cn/simg/cmshd/2022/09/01/ea8d5d4bc6c146239201034cf7731dce.jpg"
    171. }
    172. }
    173. ]
    174. }
    175. }

    POST     /dsl_search/_search
    {
        "query": {
            "match_all": {}
        },
        "_source": ["id", "nickname", "age"]
    }

    演示:

     查询结果和上面一致。

    • Head可视化操作

     分页查询

    默认查询是只有10条记录,可以通过分页来展示。

    POST     /dsl_search/_search

    1. {
    2. "query": {
    3. "match_all": {}
    4. },
    5. "from": 0,
    6. "size": 10
    7. }

    演示:

     自定义分页查询

    1. {
    2. "query": {
    3. "match_all": {}
    4. },
    5. "_source": [
    6. "id",
    7. "nickname",
    8. "age"
    9. ],
    10. "from": 5,
    11. "size": 5
    12. }

    演示:

    •  Head可视化操作

    四、term/match/match_phrase

     term精确搜索与match分词搜索

    搜索的时候会把用户搜索内容,比如"中国新闻网强大"作为一整个关键词去搜索,而不会对其进行分词后在搜索。

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "term": {
    5. "desc": "新闻网"
    6. }
    7. }
    8. }
    9. 对比
    10. {
    11. "query": {
    12. "match": {
    13. "desc": "新闻网"
    14. }
    15. }
    16. }
    • 注:match会对新闻网先进行分词(其实就是全文检索),再查询,而term则不会,直接把新闻网作为一个整的词汇去搜索。
    • head可视化操作对比

     terms多个词汇匹配检索

    相当于是tag标签页查询,比如一些新闻会打上国际/宗教/人文/娱乐这样的标签,可以完全匹配做类似标签的查询。

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "terms": {
    5. "desc": ["新闻网", "学习", "骚年"]
    6. }
    7. }
    8. }

    match_phrase短语匹配

    match:分词后只要有匹配就返回,match_phrase:分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)

    • slop:允许词语间跳过的数量
    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "match_phrase": {
    5. "desc": {
    6. "query": "大学 毕业 研究生",
    7. "slop": 3
    8. }
    9. }
    10. }
    11. }

    五、match(operator)/ids

     match扩展

    • operator

            (1) or:搜索内容分词后,只要存在一个词语匹配就展示结果

            (2) and:搜索内容分词后,都要满足词语匹配

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "match": {
    5. "desc": "xbox游戏机"
    6. }
    7. }
    8. }
    9. # 等同于
    10. {
    11. "query": {
    12. "match": {
    13. "desc": {
    14. "query": "xbox游戏机",
    15. "operator": "or"
    16. }
    17. }
    18. }
    19. }
    20. # 相当于 select * from shop where desc='xbox' or|and desc='游戏机'

    • minimum_should_match:最低匹配精度,至少有[分词后的词语个数]x百分比,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词有8个,则8x70%=5.6,则desc中至少需要有5个词语匹配,就展示。
    • minimum_should_match 也能设置具体的数字,表示个数
    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "match": {
    5. "desc": {
    6. "query": "女友生日送我好玩的xbox游戏机",
    7. "minimum_should_match": "60%"
    8. }
    9. }
    10. }
    11. }

    根据文档主键id单个查询

    GET /dsl_search/_doc/1001

    根据文档主键ids搜索

    官网地址:

    IDs | Elasticsearch Guide [8.4] | Elastic

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "ids": {
    5. "values": [
    6. "1001",
    7. "1010",
    8. "1008"
    9. ]
    10. }
    11. }
    12. }

    六、multi_match/boost

    官网地址:Multi-match query | Elasticsearch Guide [8.4] | Elastic

    multi_match

    满足使用match在多个字段中进行查询的需求

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "multi_match": {
    5. "query": "皮特帕克新闻网",
    6. "fields": ["desc", "nickname"]
    7. }
    8. }
    9. }

    boost

    权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通常来说搜索商品名称要比商品介绍的权重更高。

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "multi_match": {
    5. "query": "皮特帕克新闻网",
    6. "fields": ["desc", "nickname^10"]
    7. }
    8. }
    9. }

    nickname^10代表搜索提升10倍相关性,也就是说用户搜索的时候其实以这个nickname为主,desc为辅,nickname的匹配相关度当然要提高权重比例了。

    七、布尔查询

    • must:查询必须匹配搜索条件,譬如 and 
    • should:查询匹配满足1个以上条件,譬如 or
    • must_not:不匹配搜索条件,一个都不要满足

    实操1:

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "must": [
    6. {
    7. "multi_match": {
    8. "query": "新闻网",
    9. "fields": ["desc", "nickname"]
    10. }
    11. },
    12. {
    13. "term": {
    14. "sex": 1
    15. }
    16. },
    17. {
    18. "term": {
    19. "birthday": "1996-01-14"
    20. }
    21. }
    22. ]
    23. }
    24. }
    25. }
    26. {
    27. "query": {
    28. "bool": {
    29. "should(must_not)": [
    30. {
    31. "multi_match": {
    32. "query": "学习",
    33. "fields": ["desc", "nickname"]
    34. }
    35. },
    36. {
    37. "match": {
    38. "desc": "游戏"
    39. }
    40. },
    41. {
    42. "term": {
    43. "sex": 0
    44. }
    45. }
    46. ]
    47. }
    48. }
    49. }

    实操2:

    1. {
    2. "query": {
    3. "bool": {
    4. "must": [
    5. {
    6. "match": {
    7. "desc": "新"
    8. }
    9. },
    10. {
    11. "match": {
    12. "nickname": "新"
    13. }
    14. }
    15. ],
    16. "should": [
    17. {
    18. "match": {
    19. "sex": "0"
    20. }
    21. }
    22. ],
    23. "must_not": [
    24. {
    25. "term": {
    26. "birthday": "1992-12-24"
    27. }
    28. }
    29. ]
    30. }
    31. }
    32. }

    Head可视化组合查询

     为指定词语加权

    特殊场景下,某些词语可以单独加权,这样可以排的更加靠前。

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "bool": {
    5. "should": [
    6. {
    7. "match": {
    8. "desc": {
    9. "query": "律师",
    10. "boost": 18
    11. }
    12. }
    13. },
    14. {
    15. "match": {
    16. "desc": {
    17. "query": "进修",
    18. "boost": 2
    19. }
    20. }
    21. }
    22. ]
    23. }
    24. }
    25. }

    八、过滤器

    对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。
    post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分数去排序。
    使用场景:

    1. query:根据用户搜索条件检索匹配记录
    2. post_filter:用于查询后,对结果数据的筛选

    实操:查询账户金额大于80元,小于160元的用户。并且生日在1998-07-14的用户

    • gte:大于等于
    • lte:小于等于
    • gt:大于
    • lt:小于

    (除此以外还能做其他的match等操作也行)

    1. POST     /dsl_search/_search
    2. {
    3.     "query": {
    4.         "match": {
    5.             "desc": "新闻网游戏"
    6.         }
    7.     },
    8.     "post_filter": {
    9.         "range": {
    10.             "money": {
    11.                 "gt": 60,
    12.                 "lt": 1000
    13.             }
    14.         }
    15.     }
    16. }

    九、排序

    es的排序同sql,可以desc也可以asc,也支持组合排序。

    实操:

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "match": {
    5. "desc": "新闻网游戏"
    6. }
    7. },
    8. "post_filter": {
    9. "range": {
    10. "money": {
    11. "gt": 55.8,
    12. "lte": 155.8
    13. }
    14. }
    15. },
    16. "sort": [
    17. {
    18. "age": "desc"
    19. },
    20. {
    21. "money": "desc"
    22. }
    23. ]
    24. }

    对文本排序

    由于文本会被分词,所以往往要去做排序会报错,通常我们可以为这个字段增加额外的一个属性,类型为keyword,用于做排序。

    • 创建新的索引
    1. POST /dsl_search2/_mapping
    2. {
    3. "properties": {
    4. "id": {
    5. "type": "long"
    6. },
    7. "nickname": {
    8. "type": "text",
    9. "analyzer": "ik_max_word",
    10. "fields": {
    11. "keyword": {
    12. "type": "keyword"
    13. }
    14. }
    15. }
    16. }
    17. }
    • 插入数据
    1. POST /dsl_search2/_doc
    2. {
    3. "id": 1001,
    4. "nickname": "美丽的风景"
    5. }
    6. {
    7. "id": 1002,
    8. "nickname": "漂亮的小哥哥"
    9. }
    10. {
    11. "id": 1003,
    12. "nickname": "飞翔的巨鹰"
    13. }
    14. {
    15. "id": 1004,
    16. "nickname": "完美的天空"
    17. }
    18. {
    19. "id": 1005,
    20. "nickname": "广阔的海域"
    21. }

    • 排序
    1. {
    2. "sort": [
    3. {
    4. "nickname.keyword": "desc"
    5. }
    6. ]
    7. }

    十、高亮highlight

    高亮显示

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "match": {
    5. "desc": "新闻网"
    6. }
    7. },
    8. "highlight": {
    9. "pre_tags": [""],
    10. "post_tags": [""],
    11. "fields": {
    12. "desc": {}
    13. }
    14. }
    15. }

    十一、prefix-fuzzy-wildcard

    prefix--根据前缀搜索

    场景: 有些英文单词用户记不住,只能记住开头几个字母;

    使用match,肯定不行,match只能根据完整词汇;

    这个时候可以使用prefix

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "prefix": {
    5. "desc": "新"
    6. }
    7. }
    8. }

    fuzzy--模糊搜索

    模糊搜索,并不是指的sql的模糊搜索,而是用户在进行搜索的时候的打字错误现象,搜索引擎会自动纠正,然后尝试匹配索引库中的数据。

    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "fuzzy": {
    5. "desc": "i2.chinanews.com.co"
    6. }
    7. }
    8. }
    9. # 或多字段搜索
    10. {
    11. "query": {
    12. "multi_match": {
    13. "fields": [ "desc", "nickname"],
    14. "query": "i2.chinaneww supor",
    15. "fuzziness": "AUTO"
    16. }
    17. }
    18. }
    19. {
    20. "query": {
    21. "multi_match": {
    22. "fields": [ "desc", "nickname"],
    23. "query": "演说",
    24. "fuzziness": "1"
    25. }
    26. }
    27. }

    官方文档:

    模糊匹配查询 | Elasticsearch: 权威指南 | Elastic

    wildcard

    占位符查询

    • ?:1个字符
    • *:1个或多个字符
    1. POST /dsl_search/_search
    2. {
    3. "query": {
    4. "wildcard": {
    5. "desc": "*chinanews.com.c?"
    6. }
    7. }
    8. }
    9. {
    10. "query": {
    11. "wildcard": {
    12. "desc": "演*"
    13. }
    14. }
    15. }

    官方文档:

    Wildcard query | Elasticsearch Guide [8.4] | Elastic

  • 相关阅读:
    SpringMVC概述与简单使用
    java毕业设计新闻稿件管理系统Mybatis+系统+数据库+调试部署
    【Python21天学习挑战赛】-列表 & 元组 & range
    openwrt 断网重启检测脚本
    准备pmp考试第10天
    web前端-Ajax基础学习
    【数据结构--二叉树】平衡二叉树
    utils工具 常见函数
    Java String、StringBuffer和StringBuilder的相关总结
    java项目调用python进程
  • 原文地址:https://blog.csdn.net/Xx13624558575/article/details/126643023