Elasticsearch查询优化总结
查询优化
1 从提高查询精确度进行优化:
本部分主要针对全文搜索进行探究。
1.1 倒排索引
1.1.1 什么是倒排索引:
一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。
倒排索引的好处:
当输入一些关键词进行匹配时,包含关键词越多的文档,得分越高,即,相关度越大。
如何建立倒排索引:
好像ES会为所有精确值字段或全文字段分词后的词条自动创建倒排索引。
1.2 分析
1.2.1 什么是分析:
分析包括两部分,分词和标准化。
什么是分词:
将字符串切分成词条的过程,是我们为全文搜索添加倒排索引必不可少的一步。
什么是标准化:
比如说:
对计算机而言"diane"和"Diane"是两个不同的词。因此,如果不进行标准化,在我们的倒序索引中将会为"diane"和"Diane"分别制作文档列表。假如此时我想要搜索包含"Diane"的文档,但我的查询语句中输入的是"diane"。这个时候,只会匹配包含"diane"的文档,而绝大多数包含正确拼写的"Diane"的文档将不被匹配。我们希望,不管用户输入的是"diane"还是"Diane",所有包含"diane"或"Diane"的文档都能被匹配。这时候,我们需要先对文档进行标准化处理,将"Diane"词条标准化为"diane",所有包含"diane"或"Diane"的文档都对应到"diane"词条的文档列表。而在查询的时候,同样要对查询关键字进行标准化,使得不论用户输入的是"diane"还是"Diane",计算匹配度时,都在“diane”词条的文档列表中进行搜索。
除了处理大小写,标准化还有许多其他处理能力。
1.2.2 如何分析?——分析器
ES中带有一些现成的分析器,但想要达到特定的目标,一般要创建自定义分析器。
一个 分析器 就是在一个包里面组合了三种功能的一个包装器, 三种功能按照顺序被执行:
字符过滤器:用来整理一个尚未被分词的字符串。例如:使用 html清除
字符过滤器 来移除掉HTML文件中所有的HTML标签。一个分析器可以0或多个字符过滤器。
分词器:一个分析器必须有一个唯一的分词器。
词单元过滤器:可以修改、添加或者移除词单元。如:lowercase
和 stop
词过滤器
1.2.3 如何创建分析器:
本部分内容较多,转至Elasticsearch自定义分析器。
2 从响应速度的角度进行优化:
1. Routing参数
当执行查询时,查询会传播到各个shard(在replica之间轮询)。如何指定在哪些shard上进行查询呢?这可以通过routing参数控制。
demo:
插入数据时,添加routing参数。这里我们希望在查询的时候,只在某个user(kimchy)的tweet中进行搜索。
POST /twitter/tweet?routing=kimchy
{
"user":"kimchy",
"postDate":"2009-11-15T14:12:12",
"message":"trying out Elasticsearch"
}
查询时,指定routing为kimchy,就能只在相关的shard中进行搜索。
POST /twitter/_search?routing=kimchy
{
"query": {
"bool" : {
"must" : {
"query_string" : {
"query" : "out"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
} # 返回结果:
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.2876821,
"hits": [
{
"_index": "twitter",
"_type": "tweet",
"_id": "7tU6HmIBPZfz2v0D3QAm",
"_score": 0.2876821,
"_routing": "kimchy",
"_source": {
"user": "kimchy",
"postDate": "2009-11-15T14:12:12",
"message": "trying out Elasticsearch"
}
}
]
}
}
搜索
文档中的每个字段都将被索引并且可以被查询。
全文检索,找出所有匹配关键字的文档并按照相关性(relevance) 排序后返回结果。
映射(Mapping) 描述数据在每个字段内如何存储。映射定义了类型中的域,每个域的数据类型,以及Elasticsearch如何处理这些域。映射也用于配置与类型有关的元数据。
对字符串域,可以通过index属性控制是否索引、分析该域;通过analyser属性控制如何分析该域。
分析(Analysis) 全文是如何处理使之可以被搜索的
领域特定查询语言(Query DSL) Elasticsearch 中强大灵活的查询语言
_score
:查询结果中的_score衡量了文档与查询的匹配程度。默认情况下,首先返回最相关的文档结果,就是说,返回的文档是按照 _score
降序排列的。
如果不对某一特殊的索引或者类型做限制,就会搜索集群中的所有文档。因而,若想在一个或多个特定的索引并且在一个或者多个特定的类型中进行搜索。我们可以通过在URL中指定特定的索引和类型达到这种效果。
例如:
/_search
在所有的索引中搜索所有的类型
/gb/_search
在 gb 索引中搜索所有的类型
/gb,us/_search
在 gb 和 us 索引中搜索所有的文档
/g*,u*/_search
在任何以 g 或者 u 开头的索引中搜索所有的类型
/gb/user/_search
在 gb 索引中搜索 user 类型
/gb,us/user,tweet/_search
在 gb 和 us 索引中搜索 user 和 tweet 类型
/_all/user,tweet/_search
在所有的索引中搜索 user 和 tweet 类型
_all:当索引一个文档的时候,Elasticsearch 取出所有字段的值拼接成一个大的字符串,作为 _all
字段进行索引。搜索时,若没有指定域,则在_all中进行搜索。
例如,有如下文档:
{
"tweet": "However did I manage before Elasticsearch?",
"date": "2014-09-14",
"name": "Mary Jones",
"user_id": 1
}
执行:
GET /_search?q=mary
这就好似增加了一个名叫 _all
的额外字段:
"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"
除非设置特定字段,否则查询字符串就使用 _all
字段进行搜索。
(在刚开始开发一个应用时,_all
字段是一个很实用的特性。之后,你会发现如果搜索时用指定字段来代替 _all
字段,将会更好控制搜索结果。当 _all
字段不再有用的时候,可以将它置为失效,正如在 元数据: _all 字段 中所解释的。)
为文档中的某个域建立倒排索引,就是
1. 得出set(将所有文档中这个域里的token)
2. 对1中得到的每个token,获得出现过该token的文档列表
注意:在进行倒排索引前,需要对token进行标准化处理,使得同义词、同词根的词、大小写不一样的词分别映射给同一个词。同样,要对搜索字符串进行相同的标准化处理。
分词和标准化的过程称为分析
分析器:
1. 自定义分析器
Elasticsearch提供了开箱即用的字符过滤器、分词器和token 过滤器。这些可以组合起来形成自定义的分析器以用于不同的目的
2. 内置分析器
类型 在 Elasticsearch 中表示一类相似的文档。 类型由名称和映射(相当于数据库中的 schema)组成。
全文搜索查询优化
1 基于词项与基于全文
文本查询可以划分成两大家族:
1.1 基于词项的查询
1.2 基于全文的查询
报错及处理
1. 批量往elasticsearch中插入json数据时,报错:"reason" : "The bulk request must be terminated by a newline [\n]"
只要将json文件末尾加上一个回车键,得到一个新的空行,保存退出,重新在cmd中执行批量插入代码即可。样例
其他
因为:
POST /uri 创建
PUT /uri/xxx 更新或创建
所以在创建一个没有指定Id的文件时,要用post而不是put
Elasticsearch查询优化总结的更多相关文章
- elasticsearch 查询优化
首先对不必要的字段不做分词也就是不做索引,禁止内存交换 1.shard 一个Shard就是一个Lucene实例,是一个完整的搜索引擎. 分片数过多会导致检索时打开比较多的文件,多台服务器之间通讯成本加 ...
- 【ElasticSearch】查询优化
一.背景 每周统计接口耗时,发现耗时较长的前几个接口tp5个9都超过了1000ms. 经过分析慢查询的原因是ES查询耗时太长导致的 二.设计方案 1.问题定位 查询功能使用不当导致慢查询 索引设计存在 ...
- 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询优化技巧。
目录 一.导读 二.福利:账号借用 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! ...
- 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。
目录 一.导读 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! 四.聚合分析 4.1 ...
- 财务平台亿级数据量毫秒级查询优化之elasticsearch原理解析
财务平台进行分录分表以后,随着数据量的日渐递增,业务人员对账务数据的实时分析响应时间越来越长,体验性慢慢下降,之前我们基于mysql的性能优化做了一遍,可以说基于mysql该做的优化已经基本上都做了, ...
- (转)开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
Github, Soundcloud, FogCreek, Stackoverflow, Foursquare,等公司通过elasticsearch提供搜索或大规模日志分析可视化等服务.博主近4个月搜 ...
- Elasticsearch(GEO)空间检索查询
Elasticsearch(GEO)空间检索查询python版本 1.Elasticsearch ES的强大就不用多说了,当你安装上插件,搭建好集群,你就拥有了一个搜索系统. 当然,ES的集群优化和查 ...
- 400+节点的 Elasticsearch 集群运维
本文首发于InfoQ https://www.infoq.cn/article/1sm0Mq5LyY_021HGuXer 作者:Anton Hägerstrand 翻译:杨振涛 目录: 数据量 版本 ...
- 开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
from: http://www.w3c.com.cn/%E5%BC%80%E6%BA%90%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%B9%B ...
随机推荐
- Mac安装protobuf 流程
下载 https://github.com/google/protobuf/releases 找到对应版本下载 编译 cd protobuf./autogen.sh./configuremake 安装 ...
- BCB::TClientSocket,TServerSocket控件
一,首先服务端开启监听 ServerSocket1->Port=StrToInt(5000); ServerSocket1->Active=true; ServerSocket1控件,响应 ...
- Java后台-面试问题汇总(转载)
总结这些天面试Java开发过程中的大多数问题,综合分类有Java基础,框架,多线程,网络通信,Linux,数据库,设计模式,算法,缓存等几个模块,由于问题太多,下面先列出问题,之后有时间在写文章解答, ...
- 前端JavaScript之ECMA
1.JavaScript基础 2.语法规则 3 常用内置对象 4 函数 5 伪数组 6.异常处理 1.1 web前端分为三层 HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化 ...
- 注释java中某个方法过时
添加一个注解即可 @Deprecated
- rsync同步备份搭建
Rsync 是 Unix/Linux 下的一款应用软 在平常的运维中进常要对一些数据进行备份,以防止意外的服务器故障导致不可避免的后果,tar,cp只能适应一些小范围backup,对于几T甚至几P的数 ...
- tcl之控制流-条件运算、条件测试、逻辑表达
- http网络协议 学习摘要
一:HTTP协议状态码 状态码主要用于描述当客户端向服务器发送请求时的返回结果,标记服务端的处理是否正常,通知出现的错误等工作. 状态码整体分为五大类: 1开头的状态码:信息类状态码,主要接收请求,表 ...
- MySQL优化总结-查询总条数
1.COUNT(*)和COUNT(COL) COUNT(*)通常是对主键进行索引扫描,而COUNT(COL)就不一定了,另外前者是统计表中的所有符合的纪录总数,而后者是计算表中所有符合的COL的纪录数 ...
- ubuntu安装tomcat7
1. 下载apache-tomcat-7.0.64.tar.gz 进入tomcat官网:http://tomcat.apache.org/download-70.cgi下载相应的压缩包: 2. 上传安 ...