ES进阶语法

news/2024/7/7 5:59:33 标签: elasticsearch, 大数据, java, es, 数据库

在练习语法前,先导入官网中的数据,来进行各种的语法测试

导入数据

samples
ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />

Elasticsearch语法学习

官方文档上有详细的操作过程,就根据官方文档来进行操作

  1. 两种语法的编写形式(倾向于第一种,也叫作QueryDSL)ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
  2. 分页查询
GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "account_number": "asc",
      "age": "desc"
    }
  ],
  "from": 0,
  "size": 10
}

  1. 查看部分字段
GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "account_number": "asc",
      "age": "desc"
    }
  ],
  "from": 0,
  "size": 10,
  "_source": ["balance","firstname"]
}
  1. match匹配,可以精确也可以模糊,按照max_score评分进行排序(倒排索引)
GET /bank/_search
{
  "query": {
    "match": {
      "address": "Mill"
    }
  },
  "sort": [
    {
      "account_number": "asc",
      "age": "desc"
    }
  ],
  "from": 0,
  "size": 10,
  "_source": ["balance","firstname"]
}
  1. match_phrase短语匹配,查询时需要查的单元是完整的短语,不对短语进行分词,如果使用.keyword的话,那么就要求这个属性中只由这一个短语构成,否则就搜索不到
GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "Mill Lane"
    }
  },
  "sort": [
    {
      "account_number": "asc",
      "age": "desc"
    }
  ],
  "from": 0,
  "size": 10
}

  1. 多字段匹配,给多个字段进行query
GET /bank/_search
{
  "query": {
    "multi_match": {
      "query": "Mill",
      "fields": ["address","city"]
    }
  }
}
  
  1. bool复合查询,有must(必须满足),must_not(必须不能满足),should(可满足,可不满足)
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ]
    }
  }
}
  1. filter结果过滤,前面的这些检索都可以使用filter来做到,不同的是,filter不会计算相关性得分,这些操作都可以组合在bool中
GET /bank/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 10,
            "lte": 30
          }
        }
      }
    }
  }
}
  
  1. term查询,对于一些属性的精确查找使用term(match可以完成精确和非精确)
GET /bank/_search
{
  "query": {
    "term": {
      "age":"28"
    }
  }
}
  
  
  1. aggreation聚合
# aggreation  address 包含mill的人的年龄分布和平均年龄
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "allAge": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "aveAge":{
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0
}

在aggreation中有很多字段,后边的size等于0是为了不出现检索数据,只出现聚合数据。聚合不仅仅和水平,也可以嵌套。

  1. 在ES6后不推荐使用Type,而是直接索引下就是数据(为了减少冲突,增加效率),映射就是每个字段的类型,比如keyword,address,long等,不用指定,ES会默认进行猜测。ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />当然也可以在创建索引的时候给一些字段指定每个字段的映射规则
# 创建索引并制定映射关系
PUT /my-index
{
  "mappings": {
    "properties": {
      "age":{"type": "integer"},
      "email":{"type": "keyword"},
      "name":{"type": "text"}
    }
  }
}


添加新的字段,可以通过index为true来设置不被索引(相当于是冗余字段)

# 给已经创建的所有添加映射
PUT /my-index/_mapping
{
  "properties": {
    "employee-id": {
      "type": "keyword",
      "index": false
    }
  }
}

可以通过GET /my-index/_mapping来查看所有的映射

  1. 修改映射(没有update)只能进行数据迁移(创建一个新的索引,将以前的数据迁移过去)
PUT /new-index
{
  "mappings": {
     "properties" : {
        "account_number" : {
          "type" : "long"
        },
        "address" : {
          "type" : "keyword"
        },
        "age" : {
          "type" : "integer"
        },
        "balance" : {
          "type" : "long"
        },
        "city" : {
          "type" : "keyword"
        },
        "email" : {
          "type" : "keyword"
        },
        "employer" : {
          "type" : "text"
        },
        "firstname" : {
          "type" : "text"
        },
        "gender" : {
          "type" : "keyword"
        },
        "lastname" : {
          "type" : "text"
        },
        "state" : {
          "type" : "keyword"
        }
      }
  }
}

数据迁移,将老index,type为account的移动到new-index下

POST _reindex
{
  "source": {
    "index": "bank",
    "type": "account"
  },
  "dest": {
    "index": "new-index"
  }
}

ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />

  1. 分词器,默认使用标准分词器,可以使用此语法查看分词效果ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />默认的分词器不能满足我们要的效果,因为对中文支持不好,因此需要安装分词器插件
    在linux下安装分词器,进入ES的plugins下
    wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
    unzip elasticsearch-analysis-ik-7.4.2.zip
    ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
    为所有用户添加所有权限
    在这里插入图片描述
    进入bin目录下查看插件是否安装成功,然后docker restart elasticsearch
    ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
    测试ik分词器
    使用ik的智能分词
    ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
    使用最大单次组合
    ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
    也可以自定义词库完成分词,需要在分词器里面进行配置。
    我使用nginx服务器完成自定义分词的管理,在nginx的html/es目录下创fenci.txt,并将要规定的词写到文件中
    在这里插入图片描述

配置自定义字典的地址
ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
重启ES服务(docker restart elasticsearch
在Kibana中进行测试,可以看到分词成功
ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
ess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA1OTY4,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述" />
ES就说到这,官网上有更全面的案例和语法规则!


http://www.niftyadmin.cn/n/1490885.html

相关文章

java 二叉树第n层节点数及层序遍历

层序遍历简化代码 import java.util.LinkedList;public class TreeBi {TreeBi leftTree;TreeBi rightTree;int data;public TreeBi(int data){this.datadata;}public static void main(String[] args) {// 1// 2 3// 4 5// …

使用SpringBoot整合ES

整合ES的要求很低,只要能发送请求,那它就能操作ES,因此,下面来分析一下那种整合ES的方式更为优雅高效 ES端口选择 ES服务器有两个可选端口,一个是9200(HTTP),一个是9300&#xff08…

(转载)通俗易懂的一致性哈希算法

一致性哈希(hash)算法 一、算法背景 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题&#xff…

根据商城首页需求编写ES映射

在编写ES映射前先看看JD商城的检索页面,然后根据这个页面编写自己的检索映射,对于这些品牌,品牌属性和所属分类都是要保存的 下面这些手机就是根据上面条件检索出来的 ES数据结构的编写 那一个检索的实体中,需要哪些信息呢&am…

《代码整洁之道》读书笔记系列七

边界 1、建议不要将map(或者在边界上的其他接口)在系统中传递,如果使用map这样的边界接口,就把他保留在类或者近亲类中, 2、浏览和学习边界 3、学习型测试 确保代码按照我们想要的方式工作 单元测试 F I R S T …

回顾数据结构——使用两个栈实现一个队列和用两个队列实现一个栈

今天下午有面试,早上先来无事,写一篇博客压压惊,由于时间不多,先写个思路和实现代码,图后面有时间补上。 使用两个栈实现一个队列 核心思想:因为栈是先进后出的,所以自身带有翻转的光环&#…

《代码整洁之道》读书笔记系列八

迭进 1、通过迭进设计达到整洁目的 运行所有测试 不可重复 表达了程序员的意图 尽可能的减少类和方法的数量 以上规则按照其重要程度排序 递增式的重构代码,测试消除了对清理代码就会破坏代码的恐惧 尽可能少的类和方法 并发编程 关于并发编程的中肯说法 …

《Java并发编程的艺术》读书笔记系列一

第一章 并发编程的挑战 1、上下文切换的问题 2、死锁的问题、 3、受限于硬件和软件的资源问题 一、上下文切换问题 单核处理器也支持多线程执行代码,cpu通过给每个线程分配cpu时间片来实现这个机制,时间片非常短,需要不停的切换线程执行…