ElasticSearch学习笔记

 

目录

注意事项... 2

1.      数据库(index)... 2

2.      同义词(_alias) 3

4.表(type) 4

5.版本号控制... 7

6.search查询... 7

7.term和terms查询... 9

8.分页查询... 9

9.match查询... 10

10.指定返回查询字段... 12

11.排序... 12

12.使用通配符*,匹配字段... 13

13.范围查询... 14

14. wildcard查询(*和?查询)... 15

15. fuzzy实现模糊查询... 16

16. 高亮搜索结果... 17

17. Filter查询... 18

18. 组合过滤查询... 19

19. 过滤非空... 21

20. 过滤器缓存... 22

21. 聚合查询... 23

22. 复合查询... 27

 

 

 

注意事项

  1. 一个index只能建立一个type
  2. 修改mapping结构,只能添加字段,不能删除字段和修改字段
  3. 批量操作不能json不能换行,只能1行。批量操作可以同时进行新增,删除,修改

 

  1. 数据库(index

创建数据库

PUT taotao_v1

{

 

    "number_of_replicas": 0,

    "number_of_shards": 2

 

}

 

删除数据库

DELETE taotao_v1

 

查找数据库

GET  taotao_v1

 

 

 

  1. 同义词(_alias)

创建同义词数据库,数据库一定要先存在

PUT  _alias

    "actions": [ 

        { "add": { 

            "alias": "taotao", 

            "index": "taotao_v1" 

        }} 

    ] 

}

 

修改同义词数据库

 

POST /_aliases

    "actions": [ 

        { "remove": { 

            "alias": "taotao", 

            "index": "taotao_v2" 

        }}, 

        { "add": { 

 

            "alias": "taotao", 

            "index": "taotao_v1" 

        }} 

    ] 

}

 

 

 

 

4.表(type)

创建表

POST taotao/tb_item/_mapping

{

  "properties": {

          "title":{"type": "text","analyzer":"ik_max_word"},

          "sell_point":{"type": "text","analyzer":"ik_max_word"},

          "price":{"type": "double"},

          "cat_name":{"type": "text","analyzer":"ik_max_word"},

          "create_time":{"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"

}

  }

}

 

查看表结构

GET  taotao/tb_item/_mapping

 

 

修改表结构,添加字段,不能删除字段和修改字段

POST taotao/tb_item/_mapping

{

  "properties": {

    "name": {

      "type": "keyword"

    }

  }

}

 

删除表结构

没办法删除表结构

 

清除表数据

POST taotao/tb_item/_delete_by_query?conflicts=proceed

{

 "query": {

    "match_all": {}

  }

}

查询所有数据

POST taotao/tb_item/_search

{

 "query": {

    "match_all": {}

  }

}

 

插入数据

POST taotao/tb_item/536563

{

  "title":"new2 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待",

 "sell_point":"清仓!仅北京,武汉仓有货!",

  "price":29900000,

  "cat_name":"手机",

  "create_time":"2015-03-08 21:33:18"

}

 

修改数据

POST taotao/tb_item/536563

{

  "title":"new3 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待",

 "sell_point":"清仓!仅北京,武汉仓有货!",

  "price":29900000,

  "cat_name":"手机",

  "create_time":"2015-03-08 21:33:18"

}

 

通过id查找数据

GET taotao/tb_item/536563

 

通过多个id查找数据

GET taotao/tb_item/_mget

{

  "ids":[536563,562379]

}

 

批量操作

批量操作不能json不能换行,只能1行。批量操作可以同时进行新增,删除,修改

 

批量添加

POST taotao/tb_item/_bulk

{"index":{"_id":605616}}

{ "title":"阿尔卡特 (OT-979) 冰川白 联通3G手机","sell_point":"清仓!仅上海仓有货!","price":30900,"cat_name":"手机","create_time":"2015-03-08 21:33:18"}

{"index":{"_id":635906}}

{"title":"阿尔卡特 (OT-927) 单电版 炭黑 联通3G手机 双卡双待","sell_point":"清仓!仅北京,武汉仓有货!","price":24900,"cat_name":"手机","create_time":"2015-03-08 21:33:18"}

 

批量不同操作

POST /lib2/books/_bulk

 

{"delete":{"_index":"lib2","_type":"books","_id":4}}

 

{"create":{"_index":"tt","_type":"ttt","_id":"100"}}

 

{"name":"lisi"}

 

{"index":{"_index":"tt","_type":"ttt"}}

 

{"name":"zhaosi"}

 

{"update":{"_index":"lib2","_type":"books","_id":"4"}}

 

{"doc":{"price":58}}

 

 

 

5.版本号控制

查询显示版本号

GET taotao/tb_item/_search

{

 "version":true,

 "query": {

    "match_all": {}

  }

}

 

更新数据,版本号锁定

POST taotao/tb_item/562379?version=1

{

  "title":"new3- 三星 W999 黑色 电信3G手机 双卡双待双通"

}

 

外部版本号,外部版本号要大于内部版本号,当内部版本号为2时候,外部版本号要大于2

POST taotao/tb_item/562379?version=3&version_type=external

{

  "title":"new3- 三星 W999 黑色 电信3G手机 双卡双待双通"

}

 

6.search查询

查询所有数据

GET taotao/tb_item/_search

{

 "query": {

    "match_all": {}

  }

}

 

查询三星手机

GET taotao/tb_item/_search?q=%E4%B8%89%E6%98%9F

 

查询手机价格为:29900000

GET taotao/tb_item/_search?q=price: 29900000

 

查找手机并按价格降序排

GET taotao/tb_item/_search?q=%E6%89%8B%E6%9C%BA&sort=price:desc

 

查找手机并按价格降序排第1条

GET taotao/tb_item/_search?q=%E6%89%8B%E6%9C%BA&sort=price:desc&from=0&size=1

 

 

 

7.term和terms查询

term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date。 相当于不分词

 

查找价格为1100

GET taotao/tb_item/_search

{

  "query": {

    "term": {

      "price":1100

    }

  }

}

 

查询多个价格

GET taotao/tb_item/_search

{

  "query": {

    "terms": {

      "price":[1100,30900]

    }

  }

}

 

8.分页查询

from:从哪一个文档开始

size:需要的个数

GET taotao/tb_item/_search

{

  "from": 0,

  "size": 2,

 "query": {

    "match_all": {}

  }

}

 

 

 

9.match查询

match query知道分词器的存在,会对filed进行分词操作,然后再查询。查询条件分词

term是不知道分词器的存在,相当于查询条件不分词。

 

GET taotao/tb_item/_search

{

  "query": {

    "match": {

      "title": "三星  黑色"

    }

  }

}

结果

GET taotao/tb_item/_search

{

  "query": {

    "term": {

      "title": "三星  黑色"

    }

  }

}

 

 

查询所有文档

GET taotao/tb_item/_search

{

 "version":true,

 "query": {

    "match_all": {}

  }

}

 

multi_match:可以指定多个字段

 

GET taotao/tb_item/_search

{

  "query": {

    "multi_match": {

      "query": "黑色",

      "fields": ["title","cat_name"]

    }

  }

 

 

match_phrase:短语匹配查询相当于一个单词匹配

ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变:

 

GET taotao/tb_item/_search

{

  "query": {

    "match_phrase": {

      "title": "三星 W999"

    }

  }

}

 

前缀匹配查询

GET taotao/tb_item/_search

{

  "query": {

    "match_phrase_prefix": {

      "title": "联通3"

    }

  }

}

 

10.指定返回查询字段

GET taotao/tb_item/_search

{

 "_source":["title","price"],

 "query": {

    "match_all": {}

  }

}

 

11.排序

GET taotao/tb_item/_search

{

 "query": {

    "match_all": {}

  },

  "sort": [

    {

      "price": {

        "order": "desc"

      }

    },

    {

      "create_time": {

        "order": "desc"

      }

    }

  ]

}

 

 

 

12.使用通配符*,匹配字段

GET taotao/tb_item/_search

{

  "_source": {

    "includes": ["tit*","pr*"],

    "excludes": "sel*"

  },

  "query": {

    "match_all": {}

  }

}

 

 

 

 

13.范围查询

range:实现范围查询

 

参数:from,to,include_lower,include_upper,boost,gte,lte,gt,lt

 

include_lower:是否包含范围的左边界,默认是true

 

include_upper:是否包含范围的右边界,默认是true

GET taotao/tb_item/_search

{

  "query": {

    "range": {

     "price": {

       "gte": 10,

       "lte": 200000

     }

    }

  }

}

 

GET taotao/tb_item/_search

{

  "query": {

    "range": {

     "price": {

       "from": 10,

       "to": 200000,

      "include_lower": true,

      "include_upper": false

     }

    }

  }

}

 

 

 

14. wildcard查询(*和?查询)

允许使用通配符* 和 ?来进行查询

 

*代表0个或多个字符

 

?代表任意一个字符

GET taotao/tb_item/_search

{

  "query": {

    "wildcard": {

      "title": "联通*"

    }

  }

}

 

GET taotao/tb_item/_search

{

  "query": {

    "wildcard": {

      "title": "阿尔卡?"

    }

  }

}

 

 

 

15. fuzzy实现模糊查询

value:查询的关键字,date类型不行

 

boost:查询的权值,默认值是1.0

 

min_similarity:设置匹配的最小相似度,默认值为0.5,对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天

 

prefix_length:指明区分词项的共同前缀长度,默认是0

 

max_expansions:查询中的词项可以扩展的数目,默认可以无限大

 

GET taotao/tb_item/_search

{

  "query": {

    "fuzzy": {

      "title": "联通3"

    }

  }

}

 

 

 

 

16. 高亮搜索结果

高亮搜索结果

GET taotao/tb_item/_search

{

  "query": {

    "match": {

      "title": "阿尔卡"

    }

  },

  "highlight": {

     "pre_tags": [

          "<em class='c_color'>"

      ],

      "post_tags": [

        "</em>"

      ],

    "fields": {

             "title": {}

        }

  }

}

 

 

 

17. Filter查询

filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。

GET taotao/tb_item/_search

{

  "post_filter": {

    "match": {

      "title": "阿尔卡"

    }

  }

}

 

 

 

18. 组合过滤查询

可以实现组合过滤查询

 

格式:

 

{

    "bool": {

        "must": [],

        "should": [],

        "must_not": []

    }

}

 

must:必须满足的条件---and

 

should:可以满足也可以不满足的条件--or

 

must_not:不需要满足的条件--not

 

查询价格10元或者1100元

GET taotao/tb_item/_search

{

  "post_filter": {

    "bool":{

      "should":[

        {"term":{"price":10}},

        {"term":{"price":1100}}

      ]

    }

  }

}

 

 

 

 

查询三星手机价格10元或者1100元

GET taotao/tb_item/_search

{

  "post_filter": {

    "bool":{

      "should":[

        {"term":{"price":10}},

        {"term":{"price":1100}}

      ],

      "must":[

        {"term":{"title":"三星"}}

      ]

    }

  }

}

 

GET /lib4/items/_search

{

    "post_filter": {

          "bool": {

                "should": [

                    {"term": {"itemID": "id100123"}},

                    {

                      "bool": {

                          "must": [

                              {"term": {"itemID": "id100124"}},

                              {"term": {"price": 40}}

                            ]

                          }

                    }

                  ]

                }

            }

}

 

 

 

19. 过滤非空

GET /lib4/items/_search

{

  "query": {

    "bool": {

      "filter": {

          "exists":{

             "field":"price"

         }

      }

    }

  }

}

 

GET /lib4/items/_search

{

    "query" : {

        "constant_score" : {

            "filter": {

                "exists" : { "field" : "price" }

            }

        }

    }

}

 

 

 

20. 过滤器缓存

ElasticSearch提供了一种特殊的缓存,即过滤器缓存(filter cache),用来存储过滤器的结果,被缓存的过滤器并不需要消耗过多的内存(因为它们只存储了哪些文档能与过滤器相匹配的相关信息),而且可供后续所有与之相关的查询重复使用,从而极大地提高了查询性能。

 

注意:ElasticSearch并不是默认缓存所有过滤器,

以下过滤器默认不缓存:

 

    numeric_range

    script

    geo_bbox

    geo_distance

    geo_distance_range

    geo_polygon

    geo_shape

    and

    or

    not

 

exists,missing,range,term,terms默认是开启缓存的

 

开启方式:在filter查询语句后边加上

"_catch":true

 

 

21. 聚合查询

 

(1)sum

  

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_of_sum": {

         "sum": {

           "field": "price"

         }

     }

  }

}

 

(2)min

 

GET /lib4/items/_search

{

  "size": 0,

  "aggs": {

     "price_of_min": {

         "min": {

           "field": "price"

         }

     }

  }

}

 

(3)max

 

GET /lib4/items/_search

{

  "size": 0,

  "aggs": {

     "price_of_max": {

         "max": {

           "field": "price"

         }

     }

  }

}

 

(4)avg

 

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_of_avg": {

         "avg": {

           "field": "price"

         }

     }

  }

}

 

(5)cardinality:求基数

 

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_of_cardi": {

         "cardinality": {

           "field": "price"

         }

     }

  }

}

 

(6)terms:分组

 

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_group_by": {

         "terms": {

           "field": "price"

         }

     }

  }

}

 

 

 

对那些有唱歌兴趣的用户按年龄分组

GET /lib3/user/_search

{

  "query": {

      "match": {

        "interests": "changge"

      }

   },

   "size": 0,

   "aggs":{

       "age_group_by":{

           "terms": {

             "field": "age",

             "order": {

               "avg_of_age": "desc"

             }

           },

           "aggs": {

             "avg_of_age": {

               "avg": {

                 "field": "age"

               }

             }

           }

       }

   }

}

 

 

 

22. 复合查询

### 2.10 复合查询

 

将多个基本查询组合成单一查询的查询

 

#### 2.10.1 使用bool查询

 

接收以下参数:

 

must:

    文档 必须匹配这些条件才能被包含进来。

   

must_not:

    文档 必须不匹配这些条件才能被包含进来。

   

should:

    如果满足这些语句中的任意语句,将增加 _score,否则,无任何影响。它们主要用于修正每个文档的相关性得分。

   

filter:

    必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

   

相关性得分是如何组合的。每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。

 

下面的查询用于查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果 _两者_ 都满足,那么它排名将更高:

 

{

    "bool": {

        "must": { "match": { "title": "how to make millions" }},

        "must_not": { "match": { "tag":   "spam" }},

        "should": [

            { "match": { "tag": "starred" }},

            { "range": { "date": { "gte": "2014-01-01" }}}

        ]

    }

}

 

如果没有 must 语句,那么至少需要能够匹配其中的一条 should 语句。但,如果存在至少一条 must 语句,则对 should 语句的匹配没有要求。

如果我们不想因为文档的时间而影响得分,可以用 filter 语句来重写前面的例子:

 

{

    "bool": {

        "must": { "match": { "title": "how to make millions" }},

        "must_not": { "match": { "tag":   "spam" }},

        "should": [

            { "match": { "tag": "starred" }}

        ],

        "filter": {

          "range": { "date": { "gte": "2014-01-01" }}

        }

    }

}

 

通过将 range 查询移到 filter 语句中,我们将它转成不评分的查询,将不再影响文档的相关性排名。由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能。

 

bool 查询本身也可以被用做不评分的查询。简单地将它放置到 filter 语句中并在内部构建布尔逻辑:

 

 

{

    "bool": {

        "must": { "match": { "title": "how to make millions" }},

        "must_not": { "match": { "tag":   "spam" }},

        "should": [

            { "match": { "tag": "starred" }}

        ],

        "filter": {

          "bool": {

              "must": [

                  { "range": { "date": { "gte": "2014-01-01" }}},

                  { "range": { "price": { "lte": 29.99 }}}

              ],

              "must_not": [

                  { "term": { "category": "ebooks" }}

              ]

          }

        }

    }

}

 

#### 2.10.2 constant_score查询

 

它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。

 

{

    "constant_score":   {

        "filter": {

            "term": { "category": "ebooks" }

        }

    }

}

 

term 查询被放置在 constant_score 中,转成不评分的filter。这种方式可以用来取代只有 filter 语句的 bool 查询。

 

删除数据库

DELETE taotao_v1

 

查找数据库

GET  taotao_v1

 

 

 

  1. 同义词(_alias)

创建同义词数据库,数据库一定要先存在

PUT  _alias

    "actions": [ 

        { "add": { 

            "alias": "taotao", 

            "index": "taotao_v1" 

        }} 

    ] 

}

 

修改同义词数据库

 

POST /_aliases

    "actions": [ 

        { "remove": { 

            "alias": "taotao", 

            "index": "taotao_v2" 

        }}, 

        { "add": { 

 

            "alias": "taotao", 

            "index": "taotao_v1" 

        }} 

    ] 

}

 

 

 

 

4.表(type)

创建表

POST taotao/tb_item/_mapping

{

  "properties": {

          "title":{"type": "text","analyzer":"ik_max_word"},

          "sell_point":{"type": "text","analyzer":"ik_max_word"},

          "price":{"type": "double"},

          "cat_name":{"type": "text","analyzer":"ik_max_word"},

          "create_time":{"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"

}

  }

}

 

查看表结构

GET  taotao/tb_item/_mapping

 

 

修改表结构,添加字段,不能删除字段和修改字段

POST taotao/tb_item/_mapping

{

  "properties": {

    "name": {

      "type": "keyword"

    }

  }

}

 

删除表结构

没办法删除表结构

 

清除表数据

POST taotao/tb_item/_delete_by_query?conflicts=proceed

{

 "query": {

    "match_all": {}

  }

}

查询所有数据

POST taotao/tb_item/_search

{

 "query": {

    "match_all": {}

  }

}

 

插入数据

POST taotao/tb_item/536563

{

  "title":"new2 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待",

 "sell_point":"清仓!仅北京,武汉仓有货!",

  "price":29900000,

  "cat_name":"手机",

  "create_time":"2015-03-08 21:33:18"

}

 

修改数据

POST taotao/tb_item/536563

{

  "title":"new3 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待",

 "sell_point":"清仓!仅北京,武汉仓有货!",

  "price":29900000,

  "cat_name":"手机",

  "create_time":"2015-03-08 21:33:18"

}

 

通过id查找数据

GET taotao/tb_item/536563

 

通过多个id查找数据

GET taotao/tb_item/_mget

{

  "ids":[536563,562379]

}

 

批量操作

批量操作不能json不能换行,只能1行。批量操作可以同时进行新增,删除,修改

 

批量添加

POST taotao/tb_item/_bulk

{"index":{"_id":605616}}

{ "title":"阿尔卡特 (OT-979) 冰川白 联通3G手机","sell_point":"清仓!仅上海仓有货!","price":30900,"cat_name":"手机","create_time":"2015-03-08 21:33:18"}

{"index":{"_id":635906}}

{"title":"阿尔卡特 (OT-927) 单电版 炭黑 联通3G手机 双卡双待","sell_point":"清仓!仅北京,武汉仓有货!","price":24900,"cat_name":"手机","create_time":"2015-03-08 21:33:18"}

 

批量不同操作

POST /lib2/books/_bulk

 

{"delete":{"_index":"lib2","_type":"books","_id":4}}

 

{"create":{"_index":"tt","_type":"ttt","_id":"100"}}

 

{"name":"lisi"}

 

{"index":{"_index":"tt","_type":"ttt"}}

 

{"name":"zhaosi"}

 

{"update":{"_index":"lib2","_type":"books","_id":"4"}}

 

{"doc":{"price":58}}

 

 

 

5.版本号控制

查询显示版本号

GET taotao/tb_item/_search

{

 "version":true,

 "query": {

    "match_all": {}

  }

}

 

更新数据,版本号锁定

POST taotao/tb_item/562379?version=1

{

  "title":"new3- 三星 W999 黑色 电信3G手机 双卡双待双通"

}

 

外部版本号,外部版本号要大于内部版本号,当内部版本号为2时候,外部版本号要大于2

POST taotao/tb_item/562379?version=3&version_type=external

{

  "title":"new3- 三星 W999 黑色 电信3G手机 双卡双待双通"

}

 

6.search查询

查询所有数据

GET taotao/tb_item/_search

{

 "query": {

    "match_all": {}

  }

}

 

查询三星手机

GET taotao/tb_item/_search?q=%E4%B8%89%E6%98%9F

 

查询手机价格为:29900000

GET taotao/tb_item/_search?q=price: 29900000

 

查找手机并按价格降序排

GET taotao/tb_item/_search?q=%E6%89%8B%E6%9C%BA&sort=price:desc

 

查找手机并按价格降序排第1条

GET taotao/tb_item/_search?q=%E6%89%8B%E6%9C%BA&sort=price:desc&from=0&size=1

 

 

 

7.term和terms查询

term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date。 相当于不分词

 

查找价格为1100

GET taotao/tb_item/_search

{

  "query": {

    "term": {

      "price":1100

    }

  }

}

 

查询多个价格

GET taotao/tb_item/_search

{

  "query": {

    "terms": {

      "price":[1100,30900]

    }

  }

}

 

8.分页查询

from:从哪一个文档开始

size:需要的个数

GET taotao/tb_item/_search

{

  "from": 0,

  "size": 2,

 "query": {

    "match_all": {}

  }

}

 

 

 

9.match查询

match query知道分词器的存在,会对filed进行分词操作,然后再查询。查询条件分词

term是不知道分词器的存在,相当于查询条件不分词。

 

GET taotao/tb_item/_search

{

  "query": {

    "match": {

      "title": "三星  黑色"

    }

  }

}

结果

GET taotao/tb_item/_search

{

  "query": {

    "term": {

      "title": "三星  黑色"

    }

  }

}

 

 

查询所有文档

GET taotao/tb_item/_search

{

 "version":true,

 "query": {

    "match_all": {}

  }

}

 

multi_match:可以指定多个字段

 

GET taotao/tb_item/_search

{

  "query": {

    "multi_match": {

      "query": "黑色",

      "fields": ["title","cat_name"]

    }

  }

 

 

match_phrase:短语匹配查询相当于一个单词匹配

ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变:

 

GET taotao/tb_item/_search

{

  "query": {

    "match_phrase": {

      "title": "三星 W999"

    }

  }

}

 

前缀匹配查询

GET taotao/tb_item/_search

{

  "query": {

    "match_phrase_prefix": {

      "title": "联通3"

    }

  }

}

 

10.指定返回查询字段

GET taotao/tb_item/_search

{

 "_source":["title","price"],

 "query": {

    "match_all": {}

  }

}

 

11.排序

GET taotao/tb_item/_search

{

 "query": {

    "match_all": {}

  },

  "sort": [

    {

      "price": {

        "order": "desc"

      }

    },

    {

      "create_time": {

        "order": "desc"

      }

    }

  ]

}

 

 

 

12.使用通配符*,匹配字段

GET taotao/tb_item/_search

{

  "_source": {

    "includes": ["tit*","pr*"],

    "excludes": "sel*"

  },

  "query": {

    "match_all": {}

  }

}

 

 

 

 

13.范围查询

range:实现范围查询

 

参数:from,to,include_lower,include_upper,boost,gte,lte,gt,lt

 

include_lower:是否包含范围的左边界,默认是true

 

include_upper:是否包含范围的右边界,默认是true

GET taotao/tb_item/_search

{

  "query": {

    "range": {

     "price": {

       "gte": 10,

       "lte": 200000

     }

    }

  }

}

 

GET taotao/tb_item/_search

{

  "query": {

    "range": {

     "price": {

       "from": 10,

       "to": 200000,

      "include_lower": true,

      "include_upper": false

     }

    }

  }

}

 

 

 

14. wildcard查询(*和?查询)

允许使用通配符* 和 ?来进行查询

 

*代表0个或多个字符

 

?代表任意一个字符

GET taotao/tb_item/_search

{

  "query": {

    "wildcard": {

      "title": "联通*"

    }

  }

}

 

GET taotao/tb_item/_search

{

  "query": {

    "wildcard": {

      "title": "阿尔卡?"

    }

  }

}

 

 

 

15. fuzzy实现模糊查询

value:查询的关键字,date类型不行

 

boost:查询的权值,默认值是1.0

 

min_similarity:设置匹配的最小相似度,默认值为0.5,对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天

 

prefix_length:指明区分词项的共同前缀长度,默认是0

 

max_expansions:查询中的词项可以扩展的数目,默认可以无限大

 

GET taotao/tb_item/_search

{

  "query": {

    "fuzzy": {

      "title": "联通3"

    }

  }

}

 

 

 

 

16. 高亮搜索结果

高亮搜索结果

GET taotao/tb_item/_search

{

  "query": {

    "match": {

      "title": "阿尔卡"

    }

  },

  "highlight": {

     "pre_tags": [

          "<em class='c_color'>"

      ],

      "post_tags": [

        "</em>"

      ],

    "fields": {

             "title": {}

        }

  }

}

 

 

 

17. Filter查询

filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。

GET taotao/tb_item/_search

{

  "post_filter": {

    "match": {

      "title": "阿尔卡"

    }

  }

}

 

 

 

18. 组合过滤查询

可以实现组合过滤查询

 

格式:

 

{

    "bool": {

        "must": [],

        "should": [],

        "must_not": []

    }

}

 

must:必须满足的条件---and

 

should:可以满足也可以不满足的条件--or

 

must_not:不需要满足的条件--not

 

查询价格10元或者1100元

GET taotao/tb_item/_search

{

  "post_filter": {

    "bool":{

      "should":[

        {"term":{"price":10}},

        {"term":{"price":1100}}

      ]

    }

  }

}

 

 

 

 

查询三星手机价格10元或者1100元

GET taotao/tb_item/_search

{

  "post_filter": {

    "bool":{

      "should":[

        {"term":{"price":10}},

        {"term":{"price":1100}}

      ],

      "must":[

        {"term":{"title":"三星"}}

      ]

    }

  }

}

 

GET /lib4/items/_search

{

    "post_filter": {

          "bool": {

                "should": [

                    {"term": {"itemID": "id100123"}},

                    {

                      "bool": {

                          "must": [

                              {"term": {"itemID": "id100124"}},

                              {"term": {"price": 40}}

                            ]

                          }

                    }

                  ]

                }

            }

}

 

 

 

19. 过滤非空

GET /lib4/items/_search

{

  "query": {

    "bool": {

      "filter": {

          "exists":{

             "field":"price"

         }

      }

    }

  }

}

 

GET /lib4/items/_search

{

    "query" : {

        "constant_score" : {

            "filter": {

                "exists" : { "field" : "price" }

            }

        }

    }

}

 

 

 

20. 过滤器缓存

ElasticSearch提供了一种特殊的缓存,即过滤器缓存(filter cache),用来存储过滤器的结果,被缓存的过滤器并不需要消耗过多的内存(因为它们只存储了哪些文档能与过滤器相匹配的相关信息),而且可供后续所有与之相关的查询重复使用,从而极大地提高了查询性能。

 

注意:ElasticSearch并不是默认缓存所有过滤器,

以下过滤器默认不缓存:

 

    numeric_range

    script

    geo_bbox

    geo_distance

    geo_distance_range

    geo_polygon

    geo_shape

    and

    or

    not

 

exists,missing,range,term,terms默认是开启缓存的

 

开启方式:在filter查询语句后边加上

"_catch":true

 

 

21. 聚合查询

 

(1)sum

  

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_of_sum": {

         "sum": {

           "field": "price"

         }

     }

  }

}

 

(2)min

 

GET /lib4/items/_search

{

  "size": 0,

  "aggs": {

     "price_of_min": {

         "min": {

           "field": "price"

         }

     }

  }

}

 

(3)max

 

GET /lib4/items/_search

{

  "size": 0,

  "aggs": {

     "price_of_max": {

         "max": {

           "field": "price"

         }

     }

  }

}

 

(4)avg

 

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_of_avg": {

         "avg": {

           "field": "price"

         }

     }

  }

}

 

(5)cardinality:求基数

 

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_of_cardi": {

         "cardinality": {

           "field": "price"

         }

     }

  }

}

 

(6)terms:分组

 

GET /lib4/items/_search

{

  "size":0,

  "aggs": {

     "price_group_by": {

         "terms": {

           "field": "price"

         }

     }

  }

}

 

 

 

对那些有唱歌兴趣的用户按年龄分组

GET /lib3/user/_search

{

  "query": {

      "match": {

        "interests": "changge"

      }

   },

   "size": 0,

   "aggs":{

       "age_group_by":{

           "terms": {

             "field": "age",

             "order": {

               "avg_of_age": "desc"

             }

           },

           "aggs": {

             "avg_of_age": {

               "avg": {

                 "field": "age"

               }

             }

           }

       }

   }

}

 

 

 

22. 复合查询

### 2.10 复合查询

 

将多个基本查询组合成单一查询的查询

 

#### 2.10.1 使用bool查询

 

接收以下参数:

 

must:

    文档 必须匹配这些条件才能被包含进来。

   

must_not:

    文档 必须不匹配这些条件才能被包含进来。

   

should:

    如果满足这些语句中的任意语句,将增加 _score,否则,无任何影响。它们主要用于修正每个文档的相关性得分。

   

filter:

    必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

   

相关性得分是如何组合的。每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。

 

下面的查询用于查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果 _两者_ 都满足,那么它排名将更高:

 

{

    "bool": {

        "must": { "match": { "title": "how to make millions" }},

        "must_not": { "match": { "tag":   "spam" }},

        "should": [

            { "match": { "tag": "starred" }},

            { "range": { "date": { "gte": "2014-01-01" }}}

        ]

    }

}

 

如果没有 must 语句,那么至少需要能够匹配其中的一条 should 语句。但,如果存在至少一条 must 语句,则对 should 语句的匹配没有要求。

如果我们不想因为文档的时间而影响得分,可以用 filter 语句来重写前面的例子:

 

{

    "bool": {

        "must": { "match": { "title": "how to make millions" }},

        "must_not": { "match": { "tag":   "spam" }},

        "should": [

            { "match": { "tag": "starred" }}

        ],

        "filter": {

          "range": { "date": { "gte": "2014-01-01" }}

        }

    }

}

 

通过将 range 查询移到 filter 语句中,我们将它转成不评分的查询,将不再影响文档的相关性排名。由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能。

 

bool 查询本身也可以被用做不评分的查询。简单地将它放置到 filter 语句中并在内部构建布尔逻辑:

 

 

{

    "bool": {

        "must": { "match": { "title": "how to make millions" }},

        "must_not": { "match": { "tag":   "spam" }},

        "should": [

            { "match": { "tag": "starred" }}

        ],

        "filter": {

          "bool": {

              "must": [

                  { "range": { "date": { "gte": "2014-01-01" }}},

                  { "range": { "price": { "lte": 29.99 }}}

              ],

              "must_not": [

                  { "term": { "category": "ebooks" }}

              ]

          }

        }

    }

}

 

#### 2.10.2 constant_score查询

 

它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。

 

{

    "constant_score":   {

        "filter": {

            "term": { "category": "ebooks" }

        }

    }

}

 

term 查询被放置在 constant_score 中,转成不评分的filter。这种方式可以用来取代只有 filter 语句的 bool 查询。

elasticsearch 学习笔记包括以下内容: 一、Elasticsearch概述: - Elasticsearch是一种开源的分布式搜索和分析引擎,可以用于快速搜索、分析和存储大量的结构化和非结构化数据。 - Elasticsearch与Solr相比有一些区别,包括用户、开发和贡献者社区的规模和成熟度等方面。 二、Elasticsearch安装: 1. 下载Elasticsearch,可以从官方网站或华为云镜像下载。 2. 安装Elasticsearch。 三、安装head插件: - head插件是一个可视化的管理界面,可以方便地管理和监控Elasticsearch集群。 四、安装Kibana: 1. Kibana是一个开源的数据可视化工具,用于展示和分析Elasticsearch中的数据。 2. 下载Kibana并安装。 3. 启动Kibana并进行访问测试。 4. 可选的汉化操作。 五、ES核心概念理解: - 学习ES的核心概念,包括索引、文档、映射、查询等。 以上是elasticsearch学习笔记的主要内容,希望对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Elasticsearch 学习笔记(上)](https://blog.csdn.net/m0_52691962/article/details/127064350)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值