一个基于Lucene的搜索服务器。提供了一个分布式多用户能力的全文搜索引擎,基于RESTful接口。
它使用Java开发的。Apache开源的企业级搜索引擎。
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎
-
分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
-
实时分析的分布式搜索引擎。
-
可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
-
分片的特点
-
- Elasticsearch 是利用分片将数据分发到集群内各处
- 分片是数据的容器,文档保存在分片内
- 分片又被分配到集群内的各个节点里
- 当集群规模变动,ES会自动在各个节点中迁移分片。使得数据任然均匀分布在集群中
- 副分片是主分片的一个拷贝,作为硬件故障时的备份。并提供返回文档读操作
- 在创建索引时,确定主分片数,但是副分片可以在后面进行更改
查询分页不宜过大,页数不宜过深。
-
引擎单次搜索默认不能超过1W条数据,建议查询单页大小在10-50条。
单次插入的数据控制在500KB以内,不要超过1M。
-
ES的插入效率较低,特别是GEO坐标点的数据,若单次批量插入数据过大,可能导致服务调用超时。
使用正确的数据类型
-
对integer类型的字段做过滤条件时,使用integer类型的值查询,其他同理。
避免从ES批量导数据的行为
-
批量时深度分页和滚动查询效率低,影响搜索服务性能。
避免文档稀疏
-
文档稀疏是指多个文档间间距过大。定义好mapping后,所有的文档尽量包含全部字段,如果有的文档包含,有的文档不包含,则文档是稀疏的。
ES作为搜索工具,全量数据一定要有备份,关系型数据库或其他。
ES中的基本数据类型有
-
字符串 string
-
数字类型 long integer double 等
-
日期 date
-
布尔类型 boolean
-
二进制 binary
-
复杂的数据类型
-
-
数组类型
-
对象类型
-
嵌套类型 netsted
-
地理数据类型
-
专门数据类型
-
-
ipv4
-
完成数据类型
-
单词计数类型
-
-
注意:elasticsearch 的querystring源自Lucene的Query语法
下面列举常见的querystring用法(注意一下demo,多个field条件尽量用空格分开;AND OR TO等 使用大写;冒号可以用等号代替):
1.
sql: age = 20 and id = 10001
querystring: "+age:20 +id:10001" 或 "age:20 AND id:10001"
2.
sql: age = 20 or id = 10001
querystring: "age:20 id:10001" 或 "age:20 OR id:10001"
3.
sql: age = 20 and id != 10001
querystring: "+age:20 -id:10001"
(+代表and ; - 代表!= ;没有运算符的表示or,但至少有一个命中)
4 .
sql: age in (1,2,3)
querystring: "age:(1 OR 2 OR 3)" 或 "age:1 OR age:2 OR age:3"
5.
sql age in (20,22) and age in (30,32)
querystring: "age:(( 20 OR 22) AND (30 OR 32) )"
6.
分词查询(例如查询字段describe包含“测试”的)
querystring:"describe:测试"
通配符查询(例如查询字段describe以“测试”开头的)
querystring:"describe:测试*"
7
判断字段存在/不存在
存在photo字段的记录: "_exists_:photo"
不存在photo字段的记录:"_missing_:photo"
8.
sql: createtime between 2017-01-05 and 2017-10-31
querystring:"createtime:[2017-01-05 TO 2017-10-31]"
9.
sql: count > 10 and count < 20
querystring: "count:{1 TO 5} 或者: count:>10 OR count:<20"
10.
sql: count >= 10 and count <= 20
querystring: "count:[1 TO 5] 或者:count:>=10 OR count:<=20"
(上面是范围查询,[]中括号代表包含 ,{}代表不包含)
11.
权重分配,假设查询title 或content包含"如何操作",但是title命中的排序在content命中之前,title的优先级高于content。
querystring:"question:如何操作^2 answer:如何操作^1" ^运算符后面的数字代表权重,大于1评分会比原有的高(乘法运算)。尽量设置1-10左右,因为评分的影响因素较多,因此若效果不明显需要多次调试。
还有诸多复杂的查询语法(如正则表达式,属性通配符等等)在这里不作列举,必要时可查看Lucene的query语法。