首页 > 其他分享 >Elasticsearch查询

Elasticsearch查询

时间:2023-07-19 16:11:24浏览次数:40  
标签:count search 查询 Elasticsearch user query

Elasticsearch查询

什么是Elasticsearch?

Elasticsearch is a real-time, distributed storage, search, and analytics engine

Elasticsearch 是一个实时分布式存储、搜索、分析的引擎。

介绍那儿有几个关键字:

  • 实时

  • 分布式

  • 搜索

  • 分析

于是我们就得知道Elasticsearch是怎么做到实时的,Elasticsearch的架构是怎么样的(分布式)。存储、搜索和分析(得知道Elasticsearch是怎么存储、搜索和分析的)

为什么要用Elasticsearch

在学习一项技术之前,必须先要了解为什么要使用这项技术。所以,为什么要使用Elasticsearch呢?我们在日常开发中,数据库也能做到(实时、存储、搜索、分析)。

相对于数据库,Elasticsearch的强大之处就是可以模糊查询

有的同学可能就会说:我数据库怎么就不能模糊查询了??我反手就给你写一个SQL:

select * from user where name like '%爱国%'

的确,这样做的确可以。但是要明白的是:name like %Java3y%这类的查询是不走索引的,不走索引意味着:只要你的数据库的量很大(1亿条),你的查询肯定会是级别的

如果对数据库索引还不是很了解的同学,建议复看一下我以前的文章。我觉得我当时写得还不赖(哈哈哈) GitHub搜关键字:”索引“

而且,即便给你从数据库根据模糊匹配查出相应的记录了,那往往会返回大量的数据给你,往往你需要的数据量并没有这么多,可能50条记录就足够了。

还有一个就是:用户输入的内容往往并没有这么的精确,比如我从Google输入ElastcSeach(打错字),但是Google还是能估算我想输入的是Elasticsearch

而Elasticsearch是专门做搜索的,就是为了解决上面所讲的问题而生的,换句话说:

  • Elasticsearch对模糊搜索非常擅长(搜索速度很快)

  • 从Elasticsearch搜索到的数据可以根据评分过滤掉大部分的,只要返回评分高的给用户就好了(原生就支持排序)

  • 没有那么准确的关键字也能搜出相关的结果(能匹配有相关性的记录)

Elasticsearch的数据结构

众所周知,你要在查询的时候花得更少的时间,你就需要知道他的底层数据结构是怎么样的;举个例子:

  • 树型的查找时间复杂度一般是O(logn)

  • 链表的查找时间复杂度一般是O(n)

  • 哈希表的查找时间复杂度一般是O(1)

  • ….不同的数据结构所花的时间往往不一样,你想要查找的时候要,就需要有底层的数据结构支持

从上面说Elasticsearch的模糊查询速度很快,那Elasticsearch的底层数据结构是什么呢?我们来看看。

我们根据“完整的条件”查找一条记录叫做正向索引;我们一本书的章节目录就是正向索引,通过章节名称就找到对应的页码。

首先我们得知道为什么Elasticsearch为什么可以实现快速的“模糊匹配”/“相关性查询”,实际上是你写入数据到Elasticsearch的时候会进行分词

Elasticsearch的术语和架构

从官网的介绍我们已经知道Elasticsearch是分布式存储的,如果看过我的文章的同学,对分布式这个概念应该不陌生了。

在讲解Elasticsearch的架构之前,首先我们得了解一下Elasticsearch的一些常见术语。

  • Index:Elasticsearch的Index相当于数据库的Table

  • Type:这个在新的Elasticsearch版本已经废除(在以前的Elasticsearch版本,一个Index下支持多个Type--有点类似于消息队列一个topic下多个group的概念)

  • Document:Document相当于数据库的一行记录

  • Field:相当于数据库的Column的概念

  • Mapping:相当于数据库的Schema的概念

  • DSL:相当于数据库的SQL(给我们读取Elasticsearch数据的API)

  • Elasticsearch 写入的流程

    上面我们已经知道当我们向Elasticsearch写入数据的时候,是写到主分片上的,我们可以了解更多的细节。

    客户端写入一条数据,到Elasticsearch集群里边就是由节点来处理这次请求:

     

     

集群上的每个节点都是coordinating node协调节点),协调节点表明这个节点可以做路由。比如节点1接收到了请求,但发现这个请求的数据应该是由节点2处理(因为主分片在节点2上),所以会把请求转发到节点2上。

  • coodinate(协调)节点通过hash算法可以计算出是在哪个主分片上,然后路由到对应的节点

  • shard = hash(document_id) % (num_of_primary_shards)

路由到对应的节点以及对应的主分片时,会做以下的事:

  1. 将数据写到内存缓存区

  2. 然后将数据写到translog缓存区

  3. 每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,一旦生成segment文件,就能通过索引查询到了

  4. refresh完,memory buffer就清空了。

  5. 每隔5s中,translog 从buffer flush到磁盘中

  6. 定期/定量从FileSystemCache中,结合translog内容flush index到磁盘中。

 

Elasticsearch基本查询

1、简单查询

GET lib3/user/_search
{
 "query":{
   "match_all": {}
}
}



get lib3/user/_search
{
 "query":{
   "match_all": {}
},
 "_source":{
    "includes": "addr*",
    "excludes": ["name","bir*"]
}
}

2、控制查询返回的数量

get lib3/user/_search
{
 "from":0,
 "size":2,
 "query":{
   "terms":{
     "interests": ["changge","tiaowu"]
  }
}
}

3、排序

前缀匹配查询"match_phrase_prefix", 并使用sort实现排序:desc:降序,asc升序

GET /lib3/user/_search
{
   "query": {
       "match_phrase_prefix": {
         "interests": "you"
      }
  },
   
   "sort":[
    {
       "age":{"order": "desc"}
    }
    ]
}

4、范围查询

range:实现范围查询

参数:from,to,include_lower,include_upper,boost

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

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

GET /lib3/user/_search
{
   "query": {
       "range": {
           "birthday": {
               "from": "1990-10-10",
               "to": "2000-05-01",
                "include_lower": true,
               "include_upper": false
          }
      }
  }
}


GET /lib3/user/_search
{
   "query": {
       "range": {
           "age": {
               "from": 18,
               "to": 25,
               "include_lower": true,
               "include_upper": false
          }
      }
  }
}

5、fuzzy实现模糊查询

fuzzy 查询是 term 查询的模糊等价。

GET /lib3/user/_search
{
   "query": {
       "fuzzy": {
            "interests": "chagge"
      }
  }
}

GET /lib3/user/_search
{
   "query": {
       "fuzzy": {
            "interests": {
                "value": "chagge"
            }
      }
  }
}

6、指定返回的字段

get lib3/user/_search
{
 "_source":["name","age"],
 "query":{
   "match": {
     "interests": "changge"
  }
}
}

7、显示要的字段、去除不需要的字段、可以使用通配符*

get lib3/user/_search
{
 "query":{
   "match_all": {}
},
 "_source":{
    "includes": "addr*",
    "excludes": ["name","bir*"]
}
}

8、多条件查询

{

 "query": {

   "bool": {

     "must":[

{"match":{"title":"战"}},

{"match":{"content":"星球"}}

]

  }

}

}

must_not使用

内容里不含有“武士”

{

 "query": {

   "bool": {

     "must":{"match":{"title":"战"}},

     "must_not":{"match":{"content":"武士"}}

  }

}

}

Elasticsearch 组合查询

group by
== sql
select src_ip,count(*) as x from attack_log where timestamp > 1627747200000 and timestamp < 1629104108000 group by src_ip order by x desc limit 5;

例子

GET attack_log/_search
{
 "size":0,
 "query": {
   "bool": {
     "filter": [
      {
         "range": {
           "timestamp": {
             "gt": "1627747200000",
             "lt": "1629104108000"
          }
        }
      }
    ]
  }
},
 "aggs": {
   "group_by": {
     "terms": {
       "field": "src_ip.keyword",
       "size":5,
       "order": {
         "_count": "desc"
      }
    }
  }
}
}

返回示例

{
 "took" : 2,
 "timed_out" : false,
 "_shards" : {
   "total" : 3,
   "successful" : 3,
   "skipped" : 0,
   "failed" : 0
},
 "hits" : {
   "total" : 316,
   "max_score" : 0.0,
   "hits" : [ ]
},
 "aggregations" : {
   "group_by" : {
     "doc_count_error_upper_bound" : 0,
     "sum_other_doc_count" : 18,
     "buckets" : [
      {
         "key" : "1.1.1.1",
         "doc_count" : 99
      },
      {
         "key" : "1.1.1.4",
         "doc_count" : 62
      },
      {
         "key" : "1.1.1.7",
         "doc_count" : 59
      },
      {
         "key" : "1.1.1.6",
         "doc_count" : 49
      },
      {
         "key" : "1.1.1.8",
         "doc_count" : 29
      }
    ]
  }
}
}

组合查询

GET /analysis/_search
{
 "_source": {   ---SELECT
   "includes": ["fileName","starttime","duration","repNo","repGroup","typeOfService"],
   "excludes": ["blankKeyword","keyword","topicHitDetail"]
},
 "query": {   ---WHERE
   "bool": {
     "filter": {
       "term": {
         "typeOfService": "转账"
      }
    }
  }
},
 "aggs": {  ---GROUP BY
   "class_buckets": {  ---HAVING
     "filter": {
       "range": {
         "duration": {
           "gte": 600
        }
      }
    },
     "aggs": {
       "class_count": {
         "terms": {
           "field": "classfication_f"
        },
         "aggs": {
           "count": {
             "value_count": {
               "field": "classfication_f"
            }
          },
           "count_filter":{
             "bucket_selector": { ------HAVING
               "buckets_path": {
                 "count":"count"
              },
               "script": "params.count>=1000"
            }
          }
        }
      }
    }
  }
},
 "from": 0, ---LIMIT
 "size": 10,
 "sort": [    ---ORDER BY
  {
     "starttime": {
       "order": "desc"
    }
  }
]
}

elasticsearch 关于index

index概念包括:

1、写入的数据(API等方式)

2、es里面的索引数据

3、lucene索引

segmant-shard-index

     

标签:count,search,查询,Elasticsearch,user,query
From: https://www.cnblogs.com/Gaimo/p/17565896.html

相关文章

  • MySQL只多表查询
    多表查询内连接隐式内连接查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)表结构:emp,dept连接条件:emp.dept_id=dept.idselectemp,name,dept,namefromemp,deptwhereemp.dept_id=dept.id;selecte,name,d.namefromempe,deptdwheree.......
  • Mysql查询字段时间加减
    MySQL查询字段时间加减在MySQL中,我们经常需要对时间进行加减操作,例如需要查询一个日期的前一天或后一天的数据。本文将介绍如何在MySQL中使用函数对时间字段进行加减操作,并提供一些常见的使用场景和示例代码。DATE_ADD和DATE_SUB函数在MySQL中,我们可以使用DATE_ADD和DATE_SUB函......
  • Mysql 查询不锁表
    Mysql查询不锁表在使用Mysql数据库进行大量数据读取时,常常会遇到查询导致表锁定的问题。查询锁定表可能会导致其他线程无法对该表进行修改操作,从而影响系统的并发性能。为了解决这个问题,Mysql提供了一些方法来实现查询不锁表的操作。1.事务隔离级别事务隔离级别是控制并发访问......
  • MySQL查询两个表差异数据
    MySQL查询两个表差异数据在使用MySQL进行数据处理和分析时,有时需要比较两个表之间的差异数据。比如,我们可能需要找出在两个表中都存在的数据,或者找出只在其中一个表中存在的数据。本文将介绍如何使用MySQL进行这些差异数据查询,并提供相应的代码示例。创建示例表首先,我们需要创建......
  • 查询端口进程并结束进程
    查询占用某个端口的PIDnetstat-ano|findstr"端口号"根据PID查找进程tasklist|findstr"32080"根据PID结束进程taskkill-PID32080-F......
  • elasticsearch 聚合函数求和、求平均值
    按dlmc字段分组,对tbmj字段求和、求平均值{"aggs":{"group_by_dlmc_sum":{"terms":{"size":1000,"field":"dlmc.keyword"},......
  • MySQL在分页查询时的limit深分页问题
    在平时业务中我们会发现当分页数据特别大的时候,会出现SQL很慢的情况,下面我们来分析下为什么会出现这种情况以及如何去解决一、limit深分页问题解析我们有如下一张表CREATETABLEaccount(idint(11)NOTNULLAUTO_INCREMENTCOMMENT'主键Id',namevarchar(255)DEFAU......
  • 怎样优雅地增删查改(八):按用户关系查询
    @目录原理实现正向用户关系反向用户关系使用测试用户关系(Relation)是描述业务系统中人员与人员之间的关系,如:签约、关注,或者朋友关系。之前我们在扩展身份管理模块的时候,已经实现了用户关系管理,可以查看本系列博文之前的内容。怎样优雅地增删查改(二):扩展身份管理模块原理查询依据......
  • 1851. 包含每个查询的最小区间 (Hard)
    问题描述[1851.包含每个查询的最小区间](Hard)给你一个二维整数数组intervals,其中intervals[i]=[leftᵢ,rightᵢ]表示第i个区间开始于leftᵢ、结束于rightᵢ(包含两侧取值,闭区间)。区间的长度定义为区间中包含的整数数目,更正式地表达是rightᵢ-leftᵢ+1......
  • elasticsearch 设置自定义分词
    要在Elasticsearch中使用MySQL数据库中定义的分词,你需要执行以下步骤:将MySQL数据库中的分词数据导入到Elasticsearch中:从MySQL数据库中提取分词数据,包括分词规则、停用词等。将这些数据转换为适合Elasticsearch使用的格式,例如JSON。使用Elasticsearch的API(如BulkAPI)将分词......