苹果手机怎么清理内存把两个手机的号码分开

IT界在过去几年中出现了一个有趣的现象。很多新的技术出现并立即拥抱了“大数据”。稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化。假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中。你可以使用这三种配置完成很多同养的事情。
ES是否可以作为一个NoSQL数据库?粗看,这句话说的不太对,但是这是一个合理的场景。类似地,MongoDB在MapReduce的基础上使用分片的技术同样可以完成Hadoop可以做的工作。当然使用众多功能,我们可以在Hadoop之上(Hive、HBase、Pig和同样的一些)你也可以用多种方式查询Hadoop集群中的数据。
那么,我们现在是否能说Hadoop、MongoDB和Elasticsearch这三个是完全相同的呢?显然不行!每个工具都有自身最为适用的场景,但是每个都有相当的灵活性能够胜任不同的角色。现在的问题就变成“这些技术的最合适的使用场景是什么?”。下面我们来瞧瞧。
Elasticsearch已经超越了其最初的纯搜索引擎的角色,现在已经增加了分析和可视化的特性——但是它的核心仍旧是一个全文搜索引擎。Elasticsearch建立在Lucene之上并且支持极其快速的查询和丰富的查询语法。如果你有数百万的文档需要通过关键词进行定位时,Elasticsearch肯定是最佳选择。当然,如果你的文档是JSON的,你就可以把Elasticsearch当作一种轻量级的“NoSQL数据库”。但是Elasticsearch不是一个合适的数据库引擎,对复杂的查询和聚合并不是很强,尽管统计facet可以提供一定的关于给定查询的统计信息的支持。Elasticsearch中的facet主要是用来支持分面的浏览功能。
目前Elasticsearch已经增加了aggregation的功能
如果你在寻找一个对应于一个关键词查询的少量的文档集合,并且要支持在这些结果中分面的导航,那么Elasticsearch肯定是最好的选择。如果你需要进行更加复杂的计算,对数据执行服务端的脚本,轻松地运行MapReduce job,那么MongoDB或者Hadoop就进入待选项中。
MongoDB是NoSQL数据库,被设计成一个高可扩展,并且有自动分片的功能及一些额外性能优化的功能。MongoDB是一个面向文档的数据库,以JSON的形式进行数据的存储(准确地说可以称为BSON,对JSON进行了一些增强)——例如,一个native数据类型。MongoDB提供了一个文本索引类型来支持全文检索,所以我们可以看到在Elasticsearch和MongoDB之间的界限,基本的关键词搜索对应于文档的集合。
MongoDB超过Elasticsearch的地方在于其对于服务器端js脚本的支持、聚合的管道、MapReduce的支持和capped collections。使用MongoDB,你可以使用聚合管道来处理一个集合中的文档,通过一个管道操作的序列来多步地对文档进行处理。管道操作可以生成全新的文档并且从最终的结果中移除文档。这是一个在检索数据时的相当强的过滤、处理和转化数据的特点。MongoDB也支持对一个数据collection进行map/reduce job的执行,使用定制的js函数进行操作的map和reduce过程。这就保证了MongoDB可以对选定的数据执行任意类型的计算或者转换的终极的灵活性。
MongoDB另一个极其强大的特性称之为“Capped collections”。使用这个特性,用户可以定义一个collection的最大size——然后这个collection可以被盲写,并且会roll-over必须的数据来获取log和其他供分析的流数据。
你看到,Elasticsearch和MongoDB有一个可能的应用场景的重叠,它们不是同样的工具。但是Hadoop呢?Hadoop就是MapReduce,这已经有MongoDB就地支持了啊!是不是还有一个专属于Hadoop的场景,MongoDB就只是适合。
有!Hadoop是老MapReduce了,提供了最为灵活和强大的环境来进行大量数据的处理,毫无疑问的是能够搞定不能使用Elasticsearch或者MongoDB处理的场景。
为了更加清楚地认识到这点,看看Hadoop如何使用HDFS抽象存储的——从关联的计算特性上。通过HDFS中存储的数据,任意job都可以对于数据进行运算,使用写在核心MapReduce API上,或者使用Hadoop流技术直接使用native语言编程。基于Hadoop 2和YARN,甚至核心编程模型都已经被抽象了,你不再受到MapReduce的牵制了。使用YARN你可以在Hadoop上实现MPI并且用那种方式写job。
额外地,Hadoop生态系统提供了一个交错的工具集合,建立在HDFS和核心MapReduce之上,来进行数据的查询、分析和处理。Hive提供了一个类似SQL的语言,使得业务分析可以使用一个用户习惯的语法进行查询。HBASE提供了一个基于Hadoop的面向列的数据库。Pig和Sizzle提供了两个更加不同的编程模型来查询Hadoop数据。对存储在HDFS中的数据的使用,你可以继承Mahout的机器学习的能力至你的工具集。当使用RHadoop时,你可以直接使用R统计语言来对Hadoop数据执行高级的统计分析
所以,尽管Hadoop和MongoDB也有部分重叠的应用场景并且共同拥有一些有用的功能(无缝的水平扩展),但是两者之间还是有着特定的场景。如果你仅仅想要通过关键字和简单的分析,那么Elasticsearch可以完成任务;如果你需要查询文档,并且包含更加复杂的分析过程,那么MongoDB相当适合;如果你有一个海量的数据,需要大量不同的复杂处理和分析,那么Hadoop提供了最为广泛的工具和灵活性。
一个亘古不变的道理就是选择手头最适合的工具做事。在大数据这样的背景下,技术层出不穷,技术间的界限也是相当的模糊,这对我们的选择是一件相当困难的事情。正如你所见,特定的场景有着最适合的技术,这种差异性是相当重要的。最好的消息就是你不在限定在某一种工具或者技术上。依赖于你面对的场景,这就使得我们能够构建一个整合的系统。例如,我们知道Elasticsearch和Hadoop是可以很好地一起共事的,使用Elasticsearch快速的关键词查询,Hadoop job则能处理相当复杂的分析。
最终,采用了最大的搜索和细致的分析来确认最为合适的选择。在选择任何技术或者平台时,需要仔细地验证它们,理解这个东东适合哪些场景,哪里可以进行优化,需要做出哪些牺牲。从一个小小的预研项目开始,确认完毕后,再将技术应用到真正的平台上,缓慢地升级到新的层级。
跟随这些建议,你可以成功地在大数据技术中遨游,并且获得相应的回报。
相关 [elasticsearch mongodb hadoop] 推荐:
- 互联网 - ITeye博客
IT界在过去几年中出现了一个有趣的现象. 很多新的技术出现并立即拥抱了“大数据”. 稍微老一点的技术也会将大数据添进自己的特性,避免落大部队太远,我们看到了不同技术之间的边际的模糊化. 假如你有诸如Elasticsearch或者Solr这样的搜索引擎,它们存储着JSON文档,MongoDB存着JSON文档,或者一堆JSON文档存放在一个Hadoop集群的HDFS中.
网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项. 由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎,用来对网络爬虫抓取到的网络资源进行实时的索引和搜索. 搜 索引擎架构在ElasticSearch之上,是一个典型的分布式在线实时交互查询架构,无单点故障,高伸缩、高可用.
- 数据库 - ITeye博客
//实例化Mongo对象,连接27017端口.
//连接名为yourdb的数据库,假如数据库不存在的话,mongodb会自动建立. //从Mongodb中获得名为yourColleection的数据集合,如果该数据集合不存在,Mongodb会为其新建立.
- an74520的专栏
es的mapping设置很关键,mapping设置不到位可能导致索引重建. 请看下面各个类型介绍^_^. 每一个JSON字段可以被映射到一个特定的核心类型. JSON本身已经为我们提供了一些输入,支持
【北京上地】滴滴出行基础平台部招聘 Elasticsearch 与 Mysql binlog databus 开发工程师. 内推简历投递给: . 推销Elasticsearch. 时间序列数据库的秘密(1)—— 介绍. 时间序列数据库的秘密(2)——索引.
- CSDN博客推荐文章
对于数据库而言,无非就是增删改查,通常我们在项目应用中,READ操作又占50%以上的操作,客户往往对此也比较敏感,如果在这方面,效率上处理不好,往往是要遭后人唾弃的. 所以这时就需要索引来发挥作用了,下面我们先看一下索引给我们带来的感官上的区别,然后我们再详细说说mongodb的索引操作. 一、首先,我们向数据库中插入10万条数据:.
- CSDN博客数据库推荐文章
在mysql数据库中,慢查询日志经常作为优化数据库的依据, mongodb中依然有类似的功能. Mongodb自带的profiler,可以方便地记录所有耗时的操作,以便于调优;. 一、开始profiler功能. 开启profier功能有两种:. 第一种就是直接在启动参数里面进行设置,就在茄冬mongodb时候添加-profile=级别.
- Lianhui Wang - NoSQLFan
前两天本站刚刚分享了wordnik使用MongoDB经验的文章:《Wordnik 的 MongoDB 使用经历》,今天又看到一位朋友对这方面做的总结,分享在这里,供大家参考. 赋闲以后很长没有更新博客了,说忙完全是借口,多半因为没有兴致所致. 今天凌晨比赛多多,趁着比赛的前奏和间隙,遂浏览些技术文章.
- 高春辉 - 火丁笔记
但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了. 据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果:. 这台MongoDB服务器有没有性能问题. 先讲讲Linux是如何管理内存的.
坚持分享优质有趣的原创文章,并保留作者信息和版权声明,任何问题请联系:@。Elasticsearch的安装和基本使用
Elasticsearch 是一个搜索服务器,特点:分布式、易于扩展、全文检索、索引速度快。
因为 Elasticsearch 是
开发的,所以要先安装 Java(下载)
可用 java -version来查 看是否已安装Java
若没有安装,且jdk 在 /usr/local/src/jdk-7u79-linux-x64.gz 目录下
tar zxvf /usr/local/src/jdk-7u79-linux-x64.gz
cp -r /usr/local/src/jdk1.7.0_79/ /usr/local/java
添加 java 环境变量,保存并退出
vim /etc/profile
#在最后面添加
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
执行 source /etc/profile 使更改生效,再使用 java -version 看一下java 版本
安装 Elasticsearch ,假定安装包在 /usr/local/src/elasticsearch-2.2.0.tar.gz 目录下
tar -zxvf elasticsearch-2.2.0.tar.gz -C /usr/local
这样在 /usr/local 下就有一个 elasticsearch-2.2.0 的目录
Elasticsearch 的配置文件在 /usr/local/elasticsearch-2.2.0/config/elasticsearch.yml
打开配置文件,加入如下配置(可以不用配置)
#集群名称,若有多台服务器
cluster.name: cluster-test
#节点名称,本服务器的名称
node.name: node-136
#监听端口,默认为 9200
http.port: 9200
打开端口,Elasticsearch 默认监听9200 端口,可在 elasticsearch.yml 中修改
#打开 iptables
vim /etc/sysconfig/iptables
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9200 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 9200 -j ACCEPT
service iptables restart
启动 Elasticsearch。为安全考虑,Elasticsearch不允许 root 启动,所以你要先创建一个用于启动 Elasticsearch 的用户,并将 elasticsearch-2.2.0 文件的所有者赋予该用户
假如你已经创建了一个 elastic 的用户(我创建的用户名是 jam)
chown -R elastic:elastic /usr/local/elasticsearch-2.2.0/
启动(-d 表示后台运行)
/usr/local/elasticsearch-2.2.0/bin/elasticsearch -d
查看是否启动
ps aux |grep elastic
#有如下信息表示成功
4 17.4 320 pts/1
0:05 /usr/bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC -Dfile.encoding=UTF-8 -Djna.nosys=true -Des.path.home=/usr/local/elasticsearch-2.2.0 -cp /usr/local/elasticsearch-2.2.0/lib/elasticsearch-2.2.0.jar:/usr/local/elasticsearch-2.2.0/lib/* org.elasticsearch.bootstrap.Elasticsearch start -d
停止 Elasticsearch
# 40952 pid,就是上面信息中的 第二个数据
kill -9 44292
1、基本概念
传统关系型(如 MySQL)与 Elasticsearch 对比
Relational DB
Elasticsearch
索引(名词)即数据库
类型即表名
文档即每行数据
2、与 Elasticsearch 通信
Elasticsearch 支持 RESTful API的访问方式,这里我们使用 curl 访问和操作Elasticsearch
官方也有很多对应语言的 API 供大家选择
初探:查看 Elasticsearch 的基本信息
#pretty 参数使返回的结果格式化更易读
curl 'http://localhost:9200/?pretty'
&name& : &node-136&,
&cluster_name& : &cluster-test&,
&version& : {
&number& : &2.2.0&,
&build_hash& : &8ff36d139e16fef62cfe&,
&build_timestamp& : &T13:32:39Z&,
&build_snapshot& : false,
&lucene_version& : &5.4.1&
&tagline& : &You Know, for Search&
简单介绍一下 curl 命令
curl -X '://:/?' -d ''
HTTP方法:GET, POST, PUT, HEAD, DELETE
http或者https协议(只有在Elasticsearch前面有https代理的时候可用)
Elasticsearch集群中的任何一个节点的主机名
Elasticsearch HTTP服务所在的端口,默认为9200
API路径,资源路径(例如_count将返回集群中文档的数量)
QUERY_STRING
一些可选的查询请求参数,例如?pretty参数将返回易读的JSON数据
一个JSON格式的请求主体(如果请求需要的话)
3、elasticsearch-head 插件
这里介绍一个 Elasticsearch 可视化的管理插件 elasticsearch-head,可方便的查看,删除,管理数据(生产环境不推荐安装)
cd /usr/local/elasticsearch-2.2.0/bin/
./plugin install mobz/elasticsearch-head
访问(linux 有桌面带的可直接访问):http://127.0.0.1:9200/_plugin/head/
那外网如何访问呢,使用 Nginx 代理,修改Nginx 配置文件加入
listen 8080;
#192.168.1.136 是我的 ip 地址
server_name 192.168.1.136;
location / {
#http://127.0.0.1:9200/ 是后端代理的地址
proxy_pass http://127.0.0.1:9200/;
proxy_set_header
proxy_set_header
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_
重启nginx,在windows下访问 http://192.168.1.136:8080/_plugin/head/,界面如下
可以查看集群信息,节点信息,索引信息&都是以json 形式显示这些信息
4、创建、查看索引vc3Ryb25nPjxiciAvPg0Kz9bU2s7Sw8fAtMztvNPSu7j2w/u90CB0ZXN0ILXEy/fS/aOov8nA7b3izqrK/b7dv+KjqTwvcD4NCjxwcmUgY2xhc3M9"brush:">
curl -XPUT 'http://localhost:9200/test?pretty'
&acknowledged& : true
创建成功后,默认会分配五个主分片(创建后不可更改,通过算法将数据存放在这五个分片中的一个,增删改都是针对主分片的)和一个复制分片(可修改,每个主分片都对应一个复制分片),这两个默认值都可以在配置文件中修改,也可以在创建的时候指定,如
curl -XPUT 'http://localhost:9200/test?pretty' -d '{
&settings&: {
&number_of_shards& : 2,
#2个主分片
&number_of_replicas& : 0
#0个复制分片
curl -XGET 'http://localhost:9200/test?pretty'
5、创建、查看 类型
创建一个名叫 article 的类型(即表名),有这几个字段,id、subject、content、author
curl -XPUT 'http://localhost:9200/test/_mapping/article?pretty' -d '{
&properties&: {
&integer&,
&not_analyzed&
&subject&: {
&analyzer&:
&standard&
&content&: {
&analyzer&:
&standard&
&author&: {
&not_analyzed&
type:是指定字段的数据类型
index:有三个选项 analyzed(当成全文来搜索),not_analyzed(当成一个准确的值),no(完全不可被搜索)
analyzer:索引和搜索时全文字段(即此字段)使用的分析器,standard 为 Elasticsearch 默认的全文字段分析器(对中文不友好,可使用 ik 代替)
Elasticsearch 字段类型和对应的分类类型
Whole number
byte , short , integer , long
Floating point
float , double
查看刚才新增的类型
curl -XGET 'http://localhost:9200/test/article/_mapping/?pretty'
&test& : {
&mappings& : {
&article& : {
&properties& : {
&author& : {
&type& : &string&,
&index& : &not_analyzed&
&content& : {
&type& : &string&,
&analyzer& : &standard&
&type& : &integer&
&subject& : {
&type& : &string&,
&analyzer& : &standard&
6、创建、查看、修改、删除 文档
创建一条数据
指定 _id 的创建
curl -XPUT 'http://localhost:9200/test/article/1?pretty' -d '{
&subject&: &第一篇文章标题&,
&content&: &第一篇文章内容&,
&author&: &jam&
#文档所在的索引
&_index& : &test&,
#文档的类型名
&_type& : &article&,
#文档的字符串 ID,在请求链接中指定的1,若不指定,会自动生成
&_id& : &1&,
#文档版本号,修改或删除都会增加
&_version& : 1,
&_shards& : {
&total& : 2,
&successful& : 1,
&failed& : 0
#表示创建成功
&created& : true
自增 _id 的创建
curl -XPOST 'http://localhost:9200/test/article?pretty' -d '{
&subject&: &第二篇文章标题&,
&content&: &第二篇文章内容&,
&author&: &jam&
&_id& : &AVf_6fM1vEkwGPLuUJqp&,
查看指定文档
curl -XGET 'http://localhost:9200/test/article/1?pretty'
&_index& : &test&,
&_type& : &article&,
&_id& : &1&,
&_version& : 1,
&found& : true,
&_source& : {
&subject& : &第一篇文章标题&,
&content& : &第一篇文章内容&,
&author& : &jam&
查看所有文档(_search)
curl -XGET 'http://localhost:9200/test/article/_search?pretty'
更新文档(_update),局部更新(更新指定字段)
curl -XPOST 'http://localhost:9200/test/article/1/_update?pretty' -d '
&content& : &第一篇文章内容-更新后&
&_index& : &test&,
&_type& : &article&,
&_id& : &1&,
&_version& : 2,
&_shards& : {
&total& : 2,
&successful& : 1,
&failed& : 0
_version 版本号变为 2
curl -XDELETE 'http://localhost:9200/test/article/1?pretty'
&found& : true,
&_index& : &test&,
&_type& : &article&,
&_id& : &1&,
&_version& : 3,
&_shards& : {
&total& : 2,
&successful& : 1,
&failed& : 0
_version 版本号变为 3,说明删除是不会真正删除文档的
7、批量操作&&bulk API 介绍
先看一个批量创建文档的例子
curl -XPOST 'http://localhost:9200/test/article/_bulk?pretty' -d '
{ &index& : { &_id& : &3& } }
{ &id& : 3,&subject& : &第三篇文章标题&,&content& : &第三篇文章内容& ,&author&: &jam&}
{ &index& : { &_id& : &4& } }
{ &id& : 4,&subject& : &第四篇文章标题&,&content& : &第四篇文章内容& ,&author&: &tomi&}
&took& : 36,
&errors& : false,
&items& : [ {
&index& : {
&_index& : &test&,
&_type& : &article&,
&_id& : &3&,
&_version& : 1,
&_shards& : {
&total& : 2,
&successful& : 1,
&failed& : 0
&status& : 201
&index& : {
&_index& : &test&,
&_type& : &article&,
&_id& : &4&,
&_version& : 1,
&_shards& : {
&total& : 2,
&successful& : 1,
&failed& : 0
&status& : 201
bulk API允许我们使用单一请求来实现多个文档的 create(文档不存在时才创建) 、 index(创建新文档或替换已有文档) 、 update 或 delete
它的请求体格式如下(也就是 -d 后面的数据)
{ action: { metadata }}\n
{ request body }\n
{ action: { metadata }}\n
{ request body }\n
action 有四个选项,即 create 、 index 、 update 、 delete
metadata 为元数据,即是 _index 、_type、_id,上面的例子中,因为我在请求链接中指定了 _index (test)和_type(article),所以我只需指定 _id
request body 这里就是每条数据的具体内容,字段名和数据一一对应就可以了
需要注意的是每行必须以 &\n& 符号结尾, 包括最后一行。直接敲回车键就可以了
可以在一条 bulk 的请求体中既执行 index(创建文档),又执行 update(更新文档),还可以执行 delete(删除文档),请求体类似如下
{ &delete&: { &_index&: &test&, &_type&: &article&, &_id&: &1& }}
{ &create&: { &_index&: &test&, &_type&: &article&, &_id&: &123& }}
{ &id& : 123,&subject& : &第123篇文章标题&,&content& : &第123篇文章内容& ,&author&: &jam123&}
{ &index&: { &_index&: &test&, &_type&: &article&, &_id&: &3& }}
{ &id& : 3,&subject& : &第三篇文章标题-替换后&,&content& : &第三篇文章内容-替换后& ,&author&: &jam0&}
{ &update&: { &_index&: &test&, &_type&: &article&, &_id&: &4&} }
{ &doc& : {&content& : &第四篇文章内容-更新后&} }
delete 操作没有请求体,所以后面紧跟另一个操作
以 json 请求体的形式查询数据
1、基本查询
查询所有文档
等同于 curl -XGET &http://localhost:9200/test/article/_search?pretty&
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&match_all&: {}
# 用时 毫秒
&took& : 4,
&timed_out& : false,
&_shards& : {
&total& : 5,
&successful& : 5,
&failed& : 0
&hits& : {
&total& : 3,
&max_score& : 1.0,
&hits& : [ {
&_index& : &test&,
&_type& : &article&,
&_id& : &AVf_6fM1vEkwGPLuUJqp&,
&_score& : 1.0,
&_source& : {
&subject& : &第二篇文章标题&,
&content& : &第二篇文章内容&,
&author& : &jam&
&_index& : &test&,
&_type& : &article&,
&_id& : &4&,
&_score& : 1.0,
&_source& : {
&subject& : &第四篇文章标题&,
&content& : &第四篇文章内容-更新后&,
&author& : &tomi&
&_index& : &test&,
&_type& : &article&,
&_id& : &3&,
&_score& : 1.0,
&_source& : {
&subject& : &第三篇文章标题&,
&content& : &第三篇文章内容&,
&author& : &jam&
查询作者是名字包含 &jam& 的文档,返回 id 是 2和3 的文档
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&match&: {
&author&: &jam&
查询文章内容包含 &更新& 的文档,返回 id 是 4 的文档
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&match&: {
&content&: &更新&
2、过滤语句
1& term 过滤,主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)
查询作者是 jam 的文档,返回 id 是 2 和 3 的文档
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&author&: &jam&
2& terms 过滤,跟 term 有点类似,但 terms 允许指定多个匹配条件
查询作者是 jam 、tomi 的文档,返回 id 是2,3,4 的文档
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&terms&: {
&author&: [&jam&,&tomi&]
3& range 过滤,指定范围查找
查找 id 范围是 大于等于2,小余4 的文档,返回 id 是2,3 的文档
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&range&: {
gte :大于等于
lte:小于等于
4& bool 过滤
可以合并多个过滤条件查询结果的布尔逻辑,它有三个操作符
多个查询条件的完全匹配,相当于 and
多个查询条件的相反匹配,相当于 not
至少有一个查询条件匹配, 相当于 or
查找作者是 jam (查出 id 为 2,3 的文档),但是 id 不能为 2 的文档,返回 id 为 3的文档(should 就自己测试吧)
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&must&: { &term&: { &author&: &jam& }},
&must_not&: { &term&: { &id&: 2 }}
提示:做精确匹配搜索时,你最好用过滤语句,因为过滤语句可以缓存数据
3、查询语句
1& multi_match 查询,同时搜索多个字段
查询 subject 或者 content 字段中有 &更新& 二字的文档,返回 id 为 4 的文档,由于用的分词器是 standard ,它会把 &更新& 拆成 &更&、&新& 来查找
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&multi_match&: {
&query&: &更新&,
&fields&: [&subject&, &content&]
2& bool 查询
与 bool 过滤相似,用于合并多个查询子句。
查询 内容中带有 &第& ,但是不带有 &新& 的文档,返回 id 为 2,3 的文档
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&must&: { &match&: { &content&: &第& }},
&must_not&: { &match&: { &content&: &新& }}
3、复合查询
介绍完过滤语句和查询语句,现在我们就来将它们两个组合起来使用
请求体格式如下
&query& : {
&filtered& : {
&query& : {
&match_all& : {}
&filter& : {
&term& : {
&author& : &jam&
filtered 中可以只包含 query 或 filter 或者两者都存在,可存在多个 filter ,若不指定查询范围(query),默认为 &match_all& : {}
query 中可包含 bool 查询或match 查询
filter 中可包含各种过滤查询
现在来看一个比较复杂的例子
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&filtered&: {
&query& : {
&match_all& : {}
&filter& : {
&range&: {
&filter& : {
&must&: { &term&: { &author&: &jam& }},
&must_not&: { &term&: { &id&: 2 }}
首先是查询所有数据(可省略),可改成有条件的查询
&query& : {
&match_all& : {}
然后进行过滤查询,查询 id 范围 大于等于 2 小于等于 4 的文档
&filter& : {
&range&: {
最后再过滤,查询作者是 jam ,但是 id 不能是 2 的文档,这样就只有 id 为 3 的文档符合条件
&filter& : {
&must&: { &term&: { &author&: &jam& }},
&must_not&: { &term&: { &id&: 2 }}
这条复合查询类似如下 SQL 语句
SELECT * FROM article WHERE id &= 2 AND id &= 4 AND author = &jam& AND id != 2
4、 验证查询语句
查询语句的请求体越来越大,很容易在书写过程中出现错误,可以使用 validate API 的explain 进行验证
使用上面的复合查询语句(注意请求链接)
curl -XGET 'http://localhost:9200/test/article/_validate/query?explain&pretty' -d '
&query&: {
&filtered&: {
&query& : {
&match_all& : {}
&filter& : {
&range&: {
&filter& : {
&must&: { &term&: { &author&: &jam& }},
&must_not&: { &term&: { &id&: 2 }}
#返回,真是正确的
&valid& : true,
&_shards& : {
&total& : 1,
&successful& : 1,
&failed& : 0
&explanations& : [ {
&index& : &test&,
&valid& : true,
&explanation& : &+(+*:* #(+author:jam -id:`\b\u\u)) #ConstantScore(+ConstantScore(_type:article))&
# 将第一个filter 上面的逗号去掉,再验证。错误信息中会提示第几行,第几列出错,方便修改错误
&valid& : false,
&_shards& : {
&total& : 1,
&successful& : 1,
&failed& : 0
&explanations& : [ {
&index& : &test&,
&valid& : false,
&error& : &[test] QueryParsingException[Failed to parse]; nested: JsonParseException[Unexpected character ('\&' (code 34)): was expecting comma to separate OBJECT entries\n at [Source: org.elasticsearch.transport.netty.ChannelBufferStreamInput@3175024d; line: 8, column: 14]];; com.fasterxml.jackson.core.JsonParseException: Unexpected character ('\&' (code 34)): was expecting comma to separate OBJECT entries\n at [Source: org.elasticsearch.transport.netty.ChannelBufferStreamInput@3175024d; line: 8, column: 14]&
分析match 查询(explanation)
curl -XGET 'http://localhost:9200/test/article/_validate/query?explain&explanation&pretty' -d '
&query&: {
&match&: {
&content&: &更新&
&valid& : true,
&_shards& : {
&total& : 1,
&successful& : 1,
&failed& : 0
&explanations& : [ {
&index& : &test&,
&valid& : true,
&explanation& : &+(content:更 content:新) #ConstantScore(+ConstantScore(_type:article))&
explanations 中描述了 ES 将 &更新& 拆成 &更&、&新& 来查找
默认情况下,结果集以 _score(相关性评分) 进行倒序排列(值越高越靠前)
可以使用 sort 指定排序字段
查询 内容中包含 &第二更新& 的文档,并按照 id 倒序排列
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&match&: {
&content&: &第二更新&
&order&: &desc&
&took& : 96,
&timed_out& : false,
&_shards& : {
&total& : 5,
&successful& : 5,
&failed& : 0
&hits& : {
&total& : 3,
&max_score& : null,
&hits& : [ {
&_index& : &test&,
&_type& : &article&,
&_id& : &4&,
&_score& : null,
&_source& : {
&subject& : &第四篇文章标题&,
&content& : &第四篇文章内容-更新后&,
&author& : &tomi&
&sort& : [ 4 ]
&_index& : &test&,
&_type& : &article&,
&_id& : &3&,
&_score& : null,
&_source& : {
&subject& : &第三篇文章标题&,
&content& : &第三篇文章内容&,
&author& : &jam&
&sort& : [ 3 ]
&_index& : &test&,
&_type& : &article&,
&_id& : &AVf_6fM1vEkwGPLuUJqp&,
&_score& : null,
&_source& : {
&subject& : &第二篇文章标题&,
&content& : &第二篇文章内容&,
&author& : &jam&
&sort& : [ 2 ]
每个结果中多了个 sort 字段,就是以此来排序的,而 _score 的值为 null ,是因为计算 _score 是比较消耗性能的,而它通常主要用作排序,既然已经指定排序字段了,就不会计算 _score ,若要强制计算 _score ,可加入如下内容(与 query ,sort 同级)
&track_scores& : true
按照 _score 倒序排序,若分数相同,再按照 id 倒序排序;因为使用了 _score 排序,所以会计算出 _score ,而不需要使用 &track_scores& : true
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&query&: {
&match&: {
&content&: &第二更新&
{ &_score&: { &order&: &desc& }},
{ &id&: { &order&: &desc& }}
&sort& : [ 0. ]
&sort& : [ 0., 2 ]
&sort& : [ 0., 3 ]
这里简单介绍一下 _score 相关性评分值是如何得来的,这就涉及到了 ElasticSearch 的相似度算法( TF/IDF),即检索词频率/反向文档频率,它包括
检索词频率:检索词在该字段出现的频率,出现频率越高,相关性也越高
反向文档频率:一个词在所有文档中出现的频率,出现的越频繁,分数越低,因为像 &的& &我& 这类字出现得很频繁,对相关性贡献很低,相反,如 &ElasticSearch& 这类少见的词对相关性贡献很大,分数也就会越高
字段长度:字段越短,其权重就越高。检索词出现在一个较短的字段中比出现在一个较长的字段中所占的权重越高
我们可以使用 explain 来查看相关性评分 _score 的计算过程,将上面的请求链接改成 http://localhost:9200/test/article/_search?explain&pretty 请求体不变
这里截取一段返回值做解释
# 截取 id 为 2 的一段分析
&value& : 0.,
# 分析&第&字
&description& : &weight(content:第 in 0) [PerFieldSimilarity], result of:&,
&details& : [ {
&value& : 0.,
&description& : &score(doc=0,freq=1.0), product of:&,
&details& : [ {
&value& : 0.,
&description& : &queryWeight, product of:&,
&details& : [ {
&value& : 0.,
&description& : &idf(docFreq=1, maxDocs=1)&,
&details& : [ ]
&value& : 0.,
&description& : &queryNorm&,
&details& : [ ]
&value& : 0.,
&description& : &fieldWeight in 0, product of:&,
&details& : [ {
&value& : 1.0,
# 检索词频率 检查
&description& : &tf(freq=1.0), with freq of:&,
&details& : [ {
&value& : 1.0,
&description& : &termFreq=1.0&,
&details& : [ ]
&value& : 0.,
# 反向文档频率 检查
&description& : &idf(docFreq=1, maxDocs=1)&,
&details& : [ ]
&value& : 0.375,
# 字段长度 检查
&description& : &fieldNorm(doc=0)&,
&details& : [ ]
6、分页与返回指定字段
size 返回的结果数
from 开始数(偏移量)
先按照 id 字段顺序排序,然后从第二条(from)开始取,取两条(size)数据,返回 id 为 4 的文档
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&sort& : { &id& : { &order& : &asc&}},
&from& : 2,
&size& : 2
返回指定字段的数据。有时候数据字段太多,而我们使用的只是其中的几个字段,我么可以使用 _source 来指定返回的字段
查询所有数据, 只返回作者和标题
curl -XGET 'http://localhost:9200/test/article/_search?pretty' -d '
&_source& : [&author& ,&subject&]}

我要回帖

更多关于 苹果手机怎么清理内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信