简介:
Elastic 的底层是开源库Luence。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。搜索引擎在对数据构建索引时,需要进行分词处理。分词是指将一句话拆解成多个单字或词,这些字或词便是这句话的关键词。如
设置远程访问:
默认情况下,Elastic 只允许本机访问,如果需要远程访问,可以修改 Elastic 安装目录的config/elasticsearch.yml
文件,去掉network.host
的注释,将它的值改成0.0.0.0
,然后重新启动 Elastic。线上服务不要这样设置,要设成具体的 IP。
安装中文分词插件:
Elasticsearch 不支持对中文进行分词建立索引,需要配合扩展elasticsearch-analysis-ik来实现中文分词处理。,也可以考虑其他插件(比如 smartcn)。
基本概念:
1.Node 与 Cluster:
单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
2.Index:
curl -X GET 'http://localhost:9200/_cat/indices?v' #当前节点的所有 Index
Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。
3.Document:
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
4.Type:
$ curl 'localhost:9200/_mapping?pretty=true' #列出每个 Index 所包含的 Type。
Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。不同的 Type 应该有相似的结构(schema),举例来说,id
字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products
和logs
)应该存成两个 Index,而不是一个 Index 里面的两个 Type(虽然可以做到)。
注意:根据规划,Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。
数据的操作:
1.新增数据:
向指定的 /Index/Type 发送 PUT 请求,就可以在 Index 里面新增一条记录。比如,向/accounts/perople/发送请求,就可以新增一条人员记录。
$ curl -X PUT 'localhost:9200/accounts/perople/1' -d '
{
"user": "李四",
"title": "建筑师",
"desc": "数据库管理"
}'
2.删除数据:
删除记录就是发出 DELETE 请求。
$ curl -X DELETE 'localhost:9200/accounts/people/1'
3.更新数据:
更新记录就是使用 PUT 请求,重新发送一次数据。
$ curl -X PUT 'localhost:9200/accounts/people/1' -d '
{
"user" : "李四",
"title" : "建筑师",
"desc" : "数据库管理,软件开发"
}'
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_version":2,
"result":"updated",
"_shards":{"total":2,"successful":1,"failed":0},
"created":false
}
4.查询数据:
使用 GET 方法,直接请求/accounts/people/search,就会返回所有记录。
$ curl 'localhost:9200/accounts/people/search'
{
"took":2,
"timed_out":false,
"_shards":{"total":5,"successful":5,"failed":0},
"hits":{
"total":2,
"max_score":1.0,
"hits":[
{
"_index":"accounts",
"_type":"person",
"_id":"AV3qGfrC6jMbsbXb6k1p",
"_score":1.0,
"_source": {
"user": "李四",
"title": "工程师",
"desc": "系统管理"
}
},
{
"_index":"accounts",
"_type":"person",
"_id":"1",
"_score":1.0,
"_source": {
"user" : "张三",
"title" : "工程师",
"desc" : "数据库管理,软件开发"
}
}
]
}
}
5.全文搜索:
Elastic 的查询非常特别,使用自己的查询语法,要求 GET 请求带有数据体。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配条件" }}
}'
Elastic 默认一次返回10条结果,可以通过size
字段改变这个设置。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配条件" }},
"size": 1
}'
还可以通过from
字段,指定位移。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配条件" }},
"from": 1,
"size": 1
}'
上面代码指定,从位置1开始(默认是从位置0开始),只返回一条结果。
6.逻辑运算:
如果有多个搜索关键字, Elastic 认为它们是or关系。
$ curl 'localhost:9200/accounts/person/_search' -d '
{
"query" : { "match" : { "desc" : "匹配条件一 匹配条件二" }}
}'
上面代码搜索的是 匹配条件一 or 匹配条件二。
如果要执行多个关键词的and搜索,必须使用布尔查询。
$ curl 'localhost:9200/accounts/people/search' -d '
{
"query": {
"bool": {
"must": [
{ "match": { "desc": "匹配条件一" } },
{ "match": { "desc": "匹配条件二" } }
]
}
}
}'
参考链接: