ElasticSearch(简称ES)用于进行全文检索的查询,它的底层使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
优点:(1)分布式的实时文件存储,每个字段都被索引并可被搜索
(2)分布式的实时分析搜索引擎
(3)可以扩展到上百台服务器,处理PB级结构化或非结构化数据
(4)高度集成化的服务,上手Elasticsearch非常容易
(5)支持集群没有单点故障,支持多种语言
lunce只是一个库,想要使用它必须使用java与语言将它直接集成到自己的应用中去使用,但是lunce的配置和使用相当复杂入门难(需要创建索引和搜索索引),且lunce只能在java项目中使用,并且要以jar包的方式直接集成到项目中,且不支持集成环境 索引库和应用应处于同一个服务器,如果搜索的数据量太大就不行,因为搜索的时候会创建索引库,这个库是放在磁盘上的,数据量大 库占用的空间就会增大。
ElasticSearch是由服务端和客户端组成的
下载ES安装包:官方下载地址:https://www.elastic.co/downloads/elasticsearch
下载后是绿色版本,解压后就能直接安装
由于每个人的电脑配置不相同,低配的可以去修改解压后文件中的config文件下的jvm.options文件,改为:-Xms1g
然后去bin下运行elasticsearch.bat,成功浏览器后验证:访问:http://localhost:9200
客户端可以分为图形界面客户端和代码客户端.,这里主要讲图形界面客户端,代码客户端后面讲解
这里的的客户端以Kibana5为介绍
下载Kibana5:https://www.elastic.co/downloads/kibana,下载解压后编辑config/kibana.yml,设置elasticsearch.url的值为
已启动 的ES,即打开里面的elasticsearch.url注解。
启动Kibana5 : bin\kibana.bat,启动成功在浏览器中检验:http://localhost:5601
Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作。 url中不要出现动词。
ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。数据格式为json格式
一个document中包含:_index(这个相当于数据库名),_type(这个相当于表名),_id(这个相当于document中的唯一标志符),_source(表示文档原始数据),_all(这个表示所有字段的连接字符串)
添加有两种方式,一种是用PUT 还有一种用POST
(1)PUT方式:
#添加(put方式 即可以自定义document的id)
put crm/t_department/1
{
"id":1,
"name":"测试1",
"age":18
}
(2)POST方式:
#添加(post方式 即自动生成document的id)
post crm/t_department/
{
"id":2,
"name":"测试2",
"age":19
}
PUT 和POST的区别:
PUT添加需要指定document的id,POST添加会自动生成一个id
修改有两种方式,一种是用PUT 还有一种用POST
(1)PUT
#修改(put修改 会覆盖修改)
put crm/t_department/AWmjycKnJAiT1pGD1sJs
{
"id":2,
"name":"测试2"
}
(2)POST
#修改(post修改 只修改部分数据)
post crm/t_department/AWmjycKnJAiT1pGD1sJs/_update
{
"doc":{
"name":"测试哈哈",
"age":19
}
}
PUT 和POST的区别:
PUT修改的时候是进行的覆盖是修改 即先删除原来的 再进行添加,POST修改只修改部分数据
#删除(删除指定的document的id)
delete crm/t_department/AWmjycKnJAiT1pGD1sJs
#删除(删除整个库)
delete crm
查询的方式有很多,但都是通过GET进行查询
#根据doucument的id进行查询
get crm/t_department/1
#空搜索,查询这个库
get _search
#查询这个表中的所有数据
get crm/t_department/_search
批量查询
#批量查询(注意GET是大写),可以适用于不同数据库中
GET _mget
{
"docs": [
{
"_index": "crm",
"_type": "t_department",
"_id": "1"
},
{
"_index": "crm",
"_type": "t_department",
"_id": "2"
}
]
}
#批量查询,适用于同一数据库中的查询
GET crm/t_department/_mget
{
"ids":[1,3]
}
分页查询
#分页查询(size:表示每页显示的条数,form:表示从哪一条数#据开始查询,默认是从0开始)
GET crm/t_department/_search?size=2&from=0
关键字条件查询
#查询字符串进行搜索(关键字条件查询),需要用到q #且只能使用q,如果不指定q则查询所有
GET crm/t_department/_search?q=age:19
高级查询
#高级查询
#查询t_department表中的年龄为19-20之间的数据进行分页 #每页三条从第0条数据的开始,再按照年龄进行降序排序,然#后只显示年龄和姓名
GET crm/t_department/_search?q=age[19 TO 20]&size=3&from=0&sort=age:desc&_source=age,name
概述:DSL是为了解决上面的高级查询的语句的复杂性而产生的新的查询语言,它以json的请求形式出现
DSL包含查询与过滤
#查询年龄为:19的数据
GET crm/t_department/_search
{
"query": {
"match": {
"age": 19
}
}
}
查询t_department表中的年龄为19-20之间的数据进行分页 每页三条从第0条数据的开始,再按照年龄进行降序排序,然#后只显示年龄和姓名
#"match": {}表示必须完全匹配,应该放在query中,但是因为我这里用不上这个,所以query可以为空
GET crm/t_department/_search
{
"query": {
"match": {
"age": 19
}
},
"_source": ["name","age"],
"size": 2,
"from": 0,
"sort": [
{
"age": "desc"
}
]
}
条件范围查询:(查询年龄是18-60岁的,两边都包含)
gt表示> gte表示>= lt表示< lte表示<=
GET crm/t_department/_search
{
"query": {
"range": {
"age": {
"gte": 18,
"lte": 60
}
}
}
}
一些了解的查询:
multi_match 表示查询的时候可以匹配多个值
Term和Terms 表示查询和过滤中的单词匹配,Terms是复数形式,可以匹配多个
minimum_match 表示至少匹配的个数,默认为1
前匹配:prefix 用于查询搜索中
通配符搜索查询: wildcard 用于查询搜索中,使用*代表0~N个,使用?代表1个 例如:
"wildcard": {
"name": "文*华"
}
bool 表示条件组合查询和过滤,里面包含:must,should,must_not,filter,minimum_should_match 等,注意 如果bool下面没有must 就必须有should子句,如果有must 就可以不必有should
此处过滤用的bool,里面包含查询和过滤,而在查询处的时候,#因为match的匹配里面没有写东西 为空,所以当里面的东西为#空的时候,不能写它,而filter为过滤器,它是根据上面的查#询器查询得到所有的数据后 再对这些数据进行过滤,此处配#置的过滤器为年龄=20的数据,所以 在查询出来的值里只能得#到age=12的数据,再把这些数据进行最后面的分页排序显示设#置
#此处用的match_all 表示查询的所有的数据
GET crm/t_department/_search
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
],
"filter": {
"term": {
"age": 20
}
}
}
},
"_source": ["name","age"],
"size": 2,
"from": 0,
"sort": [
{
"age": "desc"
}
]
}
在全文检索理论中,文档的查询是通过关键字查询文档索引来进行匹配,因此将文本拆分为有意义的单词,对于搜索结果的准确性至关重要,因此,在建立索引的过程中和分析搜索语句的过程中都需要对文本串分词。
分词器有很多,指的是进行搜索的时候将词进行拆分去匹配。市面上有很多分词器,例如庖丁分词器,结巴分词器,ik等,此处以ik为例讲解。
首先配置ik分词器:进行下载ES的IK分词器插件源码地址:https://github.com/medcl/elasticsearch-analysis-ik
下载后进行打包为jar包,然后进行解压,解压之后将文件放入ES根目录/plugins/ik目录下,配置完成后需要重启服务器和客户端
文档映射Mapper:ES的文档映射(mapping)机制用于进行字段类型确认(字段是什么类型,那个分词器),将每个字段匹配为一种确定的数据类型。我的理解:指的是在创建表的时候,一些默认字段不能满足我们的需求的时候(例如 在创建字段的时候 字段类型 不是我们想要的 这时候,这时候 就需要自己来配置映射)
文档映射包括:默认映射,自定义映射,全局映射
检查映射(两种方式都可以):
(1)GET dms/user/_mapping
(2)GET dms/_mapping/user
默认映射表:
JSON type |
Field type |
Boolean: true or false |
"boolean" |
Whole number: 123 |
"long" |
Floating point: 123.45 |
"double" |
String, valid date:"2014-09-15" |
"date" |
String: "foo bar" |
"string":text,keyword |
自定义映射:
#配置自定义映射
POST aisell/_mapping/dept
{
"dept":{
"properties": {
"id": {
"type": "integer"
},
"price":{
"type": "double"
}
}
}
}
全局映射 :通过动态模板和默认设置两种方式进行实现
默认方式: _default_
表示在数据库dms中,新建的表user和表dept都会继承_defaul#t_的配置,user类型的文档中将不会合并所有字段到_all,而#dept会
PUT dms
{
"mappings": {
"_default_": {
"_all": {
"enabled": false
}
},
"user": {},
"dept": {
"_all": {
"enabled": true
}
}
}
}
动态模板 dynamic_templates(创建一个名为global_template的动态模板)
PUT _template/global_template
{
"template": "*",
"settings": { "number_of_shards": 1 },
"mappings": {
"_default_": {
"_all": {
"enabled": false
},
"dynamic_templates": [
{
"string_as_text": {
"match_mapping_type": "string",
"match": "*_text",
"mapping": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
{
"string_as_keyword": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}}
作用域:自定义映射>全局映射>默认映射
最佳实践顺序:默认映射-->全局映射-->自定义映射