草庐IT

es操作入门到高级

Songbl_ 2024-01-05 原文

1.索引

  1. 创建索引:

    put /索引名称?pretty
    
  2. 查询索引:

    get _cat/indices?v
    
  3. 删除索引:

    delete /index_name?pretty
    

2.数据

2.1 插入数据

PUT /index/_doc/id
{
    Json数据
}
示例数据:
PUT /product/_doc/1
{
    "name" : "xiaomi phone",
    "desc" :  "shouji zhong de zhandouji",
    "price" :  3999,
    "tags": [ "xingjiabi", "fashao", "buka" ]
}

2.2. 更新数据

  • 全量更新:使用put关键字,和插入数据格式相同,会完全替换掉原始数据(某些字段不传,就更新成空了)

  • 更新字段:

    post /索引名称/_doc/id/_uodate
    POST /product/_doc/1/_update
    {
        "doc": {
            "price": 2999
        }
    }
    

2.3. 查询数据

2.3.1 入门查询

  1. 查询所有

    方式一:
    get /product/_doc/_search
    
    方式二:
    get /product/_search
    {
      "query": {
        "match_all": {}
      }
    }
    
  2. 根据id查询

    GET /product/_doc/1
    

2.3.2 基本查询

2.3.2.1 Query_String

分页:

get /product/_search from=0&size=2
2.3.2.2 Query DSL
  1. match_all:匹配所有

    GET /product/_search
    {
      "query":{
        "match_all": {}
      }
    }
    
  2. match:name 中包含“nfc”

    GET /product/_search
    {
      "query": {
        "match": {
          "name": "nfc"
        }
      }
    }
    
  3. sort 排序

    多字段查询。
    query:要查询的字符串
    fields:要查询的字段
    
    GET /product/_search
    {
      "query": {
        "multi_match": {
          "query": "nfc",
          "fields": ["name","desc"]
        }
      },
      "sort": [
        {
          "price": "desc"
        }
      ]
    }
    
  4. _source 元数据:想要查询的多个字段,例子中只查询“name”

    GET /product/_search
    {
      "query":{
        "match": {
          "name": "nfc"
        }
      },
      "_source": ["name"]
    }
    
  5. 分页

    GET /product/_search
    {
      "query":{
        "match_all": {}
      },
      "sort": [
        {
          "price": "asc"
        }
      ], 
      "from": 0,
      "size": 2
    }
    
2.3.2.3 全文查询
  1. phrase search:短语搜索(match_phrase的分词结果必须在被检索字段的分词中都包含,而且顺序必须相同,默认必须都是连续的

    GET /product/_search
    {
      "query": {
        "match_phrase": {
          "name": "nfc phone"
        }
    
    }
    }
    
  2. query-term : 不会被分词

    GET /product/_search
    {
      "query": {
        "term": {
         这里nfc phone 是作为一个整体的,不会进行分词的查找
          "name": "nfc phone" 
        }
      }
    }
    
  3. match 和terms 区别

    term:代表的完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。只能查单个单词。

    terms:匹配多个词,[]中的多个词是或者的关系,只要满足一个次就可以。

    match:match搜索的时候,会先进行分词的拆分,拆完完,再来匹配,属于或的关系,只要有一个词能匹配到,就行。

    //match 匹配一个分词就行;
    //terms是书写的整体作为查找条件。
    库里是按照单个分词存储的
    GET /product/_search
    {
      "query": {
        "bool": {
        //要满足两个词
          "must": [
            {"term":{"name":"nfc"}},
            {"term":{"name":"phone"}}
          ]
        }
      }
    }
    GET /product/_search
    {
      "query": {
        "terms": {
          "name":["nfc","phone"]
        }
      }
    }
    
2.3.2.4 查询过滤条件

bool可以组合多个查询条件bool查询也采用more_matches_is_better的机制,因此满足must和should的子句的文档将会合起来并计算分值

  • must,子句必须出现在匹配的文档中,并将有助于得分。包含多个,用[]包裹,
  • filter,过滤器不计算相关度分数,只有“是,否”,用于精确匹配和范围检索。速度快。match的话,确定文档是否是应该成为结果的一部分
  • should,(可能满足or)
  • must_not ,必须不满足
案例:
GET /product/_search
{
  "query": {
"bool":{
#name中必须不能包含“erji”
      "must": [
        {"match": { "name": "xiaomi"}}
      ],
#name中必须包含“xiaomi”
      "must_not": [
        {"match": { "name": "erji"}}
      ],
#可能满足 desc字段包含nfc
      "should": [
        {"match": {
          "desc": "nfc"
        }}
      ], 
#筛选价格大于4999的doc
      "filter": [
      #这种可以理解为模板二级位置要放的东西,和上面的match一个意思
        {"range": {
          "price": {
            "gt": 4999   
          }
        }}
      ]
    }
  }
}
2.3.2.5 组合查询

搜索一台xiaomi nfc phone或者一台满足 是一台手机 并且 价格小于等于2999。

constant_score 不再计算得分排序了,所有的得分都是一样的。

GET /product/_search
{
  "query": {
    "constant_score": {
      "filter": { 
        "bool":{
          "should":[
            {"match_phrase":{"name":"xiaomi nfc phone"}},
            {
              "bool":{
                "must":[
                  {"term":{"name":"phone"}},
                  {"range":{"price":{"lte":"2999"}}}
                  ]
              }
            }
          ]
        }
      }
    }
  }
}

3. mapping

3.1 index

是否对创建对当前字段创建索引,默认true,如果不创建索引,该字段不会通过索引被搜索到,但是仍然会在source元数据中展示

3.2 analyzer

指定分析器

3.3 boost

对当前字段相关度评分权重,默认1

3.4 coerce(强迫)

是否运行强制类型转换。true 。

3.5 copy_to

我们把 city, country 及 province 三个项合并成为一个项 region,但是这个 region 并不存在于我们文档的 source 里。当我们这么定义我们的 mapping 的话,在文档被索引之后,有一个新的 region 项可以供我们进行搜索

    "city": {
      "type": "keyword",
      "copy_to": "region"
    },
    "country": {
      "type": "keyword",
      "copy_to": "region"      
    },
    "province": {
      "type": "keyword",
      "copy_to": "region"
    },
    "region": {
      "type": "text"


假如我们想搜索 country:中国,province:北京 这样的记录的话,我们可以只写如下的一条语句就可以了

GET twitter/_search 
{
  "query": {
    "match": {
      "region": {
        "query": "中国 北京",
        "minimum_should_match": 4
      }
    }
  }
}

3.6 doc_values

为了提升排序和聚合效率,默认true,如果确定不需要对字段进行排序和聚合,也不需要通过脚本访问值,可以禁用doc值以节省磁盘空间

3.7 dynamic(动态的)

控制是否可以动态添加新字段(在插入消息的时候)。

  1. true,新检测到的字段将添加到映射中(默认)
  2. false,新检测到的字段被忽略。这些字段将不会被索引,因此无法查询,但是仍然回出现再_source返回的匹配项中。这些字段不会添加到映射中,必须显式添加新字段。
  3. strict,如果检测到新字段,回引发异常并拒绝文档。必须将新字段显式添加到映射中
3.8 eager_global_ordinals

不应该用于冻结的索引,对于一个冻结索引,全局序数在每次搜索时重建后被丢弃,当请求它们时重新构建,这导致在每次搜索时重新加载全局序数。用于聚合的字段上,优化聚合性能(冻结索引)

3.9 enable

是否创建倒排索引,可以对字段操作,也可以对索引操作,

3.10 fielddate

4. 高级查询

4.1 _mget

有关es操作入门到高级的更多相关文章

  1. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  5. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  6. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  7. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  8. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  9. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  10. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

随机推荐