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 ...
随机推荐
- CCF CSP 201712-2 游戏
题目链接:http://118.190.20.162/view.page?gpid=T67 问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐 ...
- linux df -h显示空间信息不正确
在linux系统上有时发现使用df 查看磁盘已使用空间和使用du统计的不相等,例如: [running]root@slave11:/$ df -h Filesystem Size ...
- Linux内存管理 —— 内核态和用户态的内存分配方式
1. 使用buddy系统管理ZONE我的这两篇文章buddy系统和slab分配器已经分析过buddy和slab的原理和源码,因此一些细节不再赘述.所有zone都是通过buddy系统管理的,buddy ...
- 第4章 初识STM32—零死角玩转STM32-F429系列
第4章 初识STM32 集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考资 ...
- 统一项目中编码风格(Eclipse Java code format、codetemplate)
在公司内的日常开发过程中,除了需要遵守统一的编码规范之外,还需要对编写的代码做统一的格式化,Eclipse提供了格式化编码的工具,快捷键是:Ctrl+Shift+F. 为了统一项目组的代码风格,建议使 ...
- Linq to Entity 时间差作为筛选条件产生的问题
前言 在使用 Linq to Entity 的時候,會把之前 Linq to SQL 的想法就帶進去,寫好之後編譯也都不會出錯,但是實際上在跑的時候就會出現錯誤訊息了,這點真的要注意了.這次我遇到問題 ...
- CRC32为例详细解析(菜鸟至老鸟进阶)
CRC-知识解析 cyclic redundancy check 写在前面的话: 之前在做学校项目的时候用到了CRC 原理,但在网上查找的过程中,发现讲解CRC知识的资源很多,但是对新手比较友好的.讲 ...
- Manacher算法:求解最长回文字符串,时间复杂度为O(N)
原文转载自:http://blog.csdn.net/yzl_rex/article/details/7908259 回文串定义:"回文串"是一个正读和反读都一样的字符串,比如&q ...
- ajax 传递文件成功时 jQuery提示parsererror错误
后台返回值类型 改为:PrintWriter out = response.getWriter();String jsonStr = "{\"success\":\&qu ...
- 笔记-python-多线程-深入-1
笔记-python-多线程-深入-1 1. 线程池 1.1. 线程池:控制同时存在的线程数量 threading没有线程池,只能自己控制线程数量. 基本有两种方式: 每间隔一段时间创建 ...