赞
踩
最近项目中接入了Elastic Search,趁热打铁,总结一下。
概念:输入关键字,获取到想要的关键字相关的信息
场景:
数据量小,简单的搜索功能时可以用到常用的数据库,如:后台管理系统里的常见的查询
Lucene是apache下的一个开源的,一套用java写的全文检索的工具包。
Lucene中对文档检索基于倒排索引实现,并将它发挥到了极致。
倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
例如:
id | 句子 |
---|---|
1 | I like apples |
2 | I dislike apples |
3 | I dislike apples too |
如果要用单词作为索引,而句子的位置作为被索引的元素,那么索引就发生了倒置:
id | 单词索引 |
---|---|
I | {1,2,3} |
like | {1} |
apples | {1,2,3} |
dislike | {2,3} |
too | {3} |
如果要检索I dislike apples这句话,那么就可以这么计算 : {1,2,3} ^ {2,3} ^ {1,2,3} (^是交集)
当用户在淘宝上搜索关键词“小米洗衣机”时,假如只存在正向索引(forward index),那么就需要扫描索引库中的所有文档,然后找出所有包含关键词“小米洗衣机”的文档,再根据一定的机制排序后展示给用户。
因为淘宝上的商品(或者互联网上收录在搜索引擎中的文档的数目等)是个天文数字,这样的索引结构不可能做的到实时返回给用户。
所以,搜索引擎会将正向索引重新构建为倒排索引,即把文档ID对应到关键词的映射转换为关键词到文档ID的映射,每个关键词都对应着一系列的文档,这些文档中都出现这个关键词。最后再通过文档ID找到对应的详细文档。
Elasticsearch 是一个分布式的、开源的搜索分析引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化。
Elasticsearch | 关系型数据库(如Mysql) |
---|---|
索引Index | 数据库Database |
类型Type | 表Table |
文档Document | 数据行Row |
字段Field | 数据列Column |
映射Mapping | 约束 Schema |
以下是基于linux环境下安装好的elastic search 5.5.1版本(默认端口9200):
curl localhost:9200
成功的返回结果
- {
- "name" : "g8MxBRF",
- "cluster_name" : "elasticsearch",
- "cluster_uuid" : "Y9ByiiOkRzGNYG91pw7ARA",
- "version" : {
- "number" : "5.5.1",
- "build_hash" : "19c13d0",
- "build_date" : "2017-07-18T20:44:24.823Z",
- "build_snapshot" : false,
- "lucene_version" : "6.6.0"
- },
- "tagline" : "You Know, for Search"
- }
新增
curl -X PUT 'localhost:9200/city'
返回成功结果:里面的acknowledged字段表示操作成功
{"acknowledged":true,"shards_acknowledged":true}
删除
curl -X DELETE 'localhost:9200/city'
返回成功结果
{"acknowledged":true}
RESTful接口URL的格式:
http://localhost:9200/<index>/<type>/[<id>]
往city索引中添加shenzhen城市: uri地址的 ? 后添加的的 pretty 参数,会让返回结果以工整方式美化
curl -H "Content-Type: application/json" -XPUT 'http://localhost:9200/city/shenzhen/1?pretty' -d '{"name":"ShenZhen","area":["NanShan","FuTian"]}'
返回成功结果
- {
- "_index" : "city",
- "_type" : "shenzhen",
- "_id" : "1",
- "_version" : 1,
- "result" : "created",
- "_shards" : {
- "total" : 2,
- "successful" : 1,
- "failed" : 0
- },
- "created" : true
- }
1、uri里没添加id,提示错误:
No handler found for uri [/city/shenzhen/?pretty] and method [PUT]
原因: 使用put方法时id是必填的,使用post方法可以让es自动生成id 解决: 使用post方法
curl -H "Content-Type: application/json" -XPOST 'http://localhost:9200/city/shenzhen/?pretty' -d '{"name":"ShenZhen","area":["NanShan","FuTian"]}'
或者 put方法uri加上id值
curl -H "Content-Type: application/json" -XPUT 'http://localhost:9200/city/shenzhen/1?pretty' -d '{"name":"ShenZhen","area":["NanShan","FuTian"]}'
删除id为1的document
curl -X DELETE 'http://localhost:9200/city/shenzhen/1?pretty'
返回结果
- {
- "found" : true,
- "_index" : "city",
- "_type" : "shenzhen",
- "_id" : "1",
- "_version" : 2,
- "result" : "deleted",
- "_shards" : {
- "total" : 2,
- "successful" : 1,
- "failed" : 0
- }
- }
官方文档search基本用法: https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
查询索引为city前20行,匹配字段为“area”,值包含“NanShan”的文档
- curl -X GET "localhost:9200/city/_search?from=0&size=20&pretty" -H 'Content-Type: application/json' -d'
- {
- "query": {
- "match": {
- "area": "NanShan"
- }
- }
- }
- '
查询结果:
- {
- "took" : 5,
- "timed_out" : false,
- "_shards" : {
- "total" : 5,
- "successful" : 5,
- "failed" : 0
- },
- "hits" : {
- "total" : 1,
- "max_score" : 0.25811607,
- "hits" : [
- {
- "_index" : "city",
- "_type" : "guangzhou",
- "_id" : "AXrce1sUTV0OiJf0oUac",
- "_score" : 0.25811607,
- "_source" : {
- "name" : "ShenZhen",
- "area" : [
- "NanShan",
- "FuTian"
- ]
- }
- }
- ]
- }
- }
参考文献: https://blog.csdn.net/alex_xfboy/article/details/83052206
https://www.cnblogs.com/wupeixuan/p/12514843.html
https://www.cnblogs.com/momoyan/p/1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。