1.ElasticSearch是什么
Elasticsearch是一个底层基于Lucene库开发的分布式搜索引擎,它提供了一个在分布式环境下提供支持多用户搜索能力的全文搜索引擎,基于HTTP的RESTful接口,并使用JSON文档做为查询语句。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前最受欢迎的企业搜索引擎之一。Elasticsearch目前官方和社区支持的客户端有20多种语言实现,如Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby、GO等
2.ElasticSearch 优势
- 横向可扩展性
- 只需增加服务器,做一些配置文件修改,启动就可以并入集群
- 分片机制提供更好的分布性
- 同一个索引文件分成多个分片(sharding),这点类似于 HDFS 的块机制,分而治之的方式可以提高处理效率
- 注意:集群创建后,主分片的数量是不能够改变的,索引数据的存储依赖于主分片数量进行逻辑处理的
- 高可用
- 提供复制(relpica)机制,一个分片可以设置多个复制,使得某台服务器宕机,集群可以使用,
并把宕机数据恢复到其他可用节点 - 使用简单 : 只需一条命令就可以下载文件,然后很快就可以搭建一个站内搜索引擎
- 提供复制(relpica)机制,一个分片可以设置多个复制,使得某台服务器宕机,集群可以使用,
3.DSL查询与过滤
1.什么是DSL查询
由ES提供丰富且灵活的查询语言叫做DSL查询(Query DSL),它允许你构建更加复杂、强大的查询。
DSL(Domain Specific Language特定领域语言)以JSON请求体的形式出现。我们可以这样表示之前关于“倪先华”的查询:
查询字符串模式:GET itsource/employee/_search?q=fullName:倪先华
DSL模式:
GET itsource/employee/_search
{
"query" : {
"match" : {
"fullName" : "倪先华"
}
}
}
2.DSL查询
使用DSL查询,必须要传递query参数给ES。
一个常用的相对完整的DSL查询:
GET itsource/employee/_search
{
"query": {
"match": {"sex":"女"}
},
"from": 20,
"size": 10,
"_source": ["fullName", "age", "email"],
"sort": [{"join_date": "desc"},{"age": "asc"}]
}
4.分词与映射
分词:
ES默认对英文文本的分词器支持较好,但和lucene一样,如果需要对中文进行全文检索,那么需要使用中文分词器,同lucene一样,在使用中文全文检索前,需要集成IK分词器。
ES的IK分词器插件源码地址:https://github.com/medcl/elasticsearch-analysis-ik
① Maven打包IK插件
② 解压target/releases/elasticsearch-analysis-ik-5.2.2.zip文件
并将其内容放置于ES根目录/plugins/ik
③ 配置插件:
插件配置:plugin-descriptor.properties
④ 分词器(可默认)
词典配置:config/IKAnalyzer.cfg.xml
⑤ 重启ES
⑥ 测试分词器
POST _analyze
{
“analyzer”:“ik_smart”,
“text”:“中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首”
}
注意:IK分词器有两种类型,分别是ik_smart分词器和ik_max_word分词器。
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
文档映射Mapper:
① 基本字段类型
字符串:text(分词),keyword(不分词) StringField(不分词文本),TextFiled(要分词文本)
text默认为全文文本,keyword默认为非全文文本
数字:long,integer,short,double,float
日期:date
逻辑:boolean
② 复杂数据类型
对象类型:object
数组类型:array
地理位置:geo_point,geo_shape
同时对多个类型的映射配置方式(推荐)
PUT {indexName}
{
"mappings": {
"user": {
"properties": {
"id": {
"type": "integer"
},
"info": {
"type": "text",
"analyzer": "ik_smart",
"search_analyzer"
}
}
},
"dept": {
"properties": {
"id": {
"type": "integer"
},
....更多字段映射配置
}
}
}
}