关于 elasticsearch 的背景和与常规关系型数据库的概念区分自行查找
一、安装elasticsearch
brew install elasticsearch
如果报错,按照提示先安装java相关环境。没有梯子基本可以放弃。
二、安装kibana
brew install kibana
brew services start kibana
- 浏览器访问
http://localhost:5601
-> Dev Tools
三、索引index
- 创建名为 my_index 的索引
PUT my_index
- 查看索引信息
GET my_index/_settings
- 删除索引
DELETE my_index
四、类型type
- 在 6+ 版本只可创建一个,在 7+ 版本不再可以创建(会给一个默认的)。
- 本文介绍中不用特意创建 type
五、文档Document
-
创建数据行
PUT my_index/my_type/1 { "id":1, "name":"Alice", "date":"2020-01-01", "like": "apple and orange" }
其中 my_index 为索引,my_type为类型,1为文档id。请求方式可以为
PUT
或POST
文档id可以指定,也可以自动生成, 必须使用POST
POST my_index/my_type { "id":2, "name":"Bob", "date":"2020-01-01", "like":"banana and pear" }
查看一下
GET my_index/_search
,观察 _id 字段。Bob的为 AXBXHlWdGy6roZEZWR9P -
查看数据行。
已知 id, 单独查看 Bob 信息GET my_index/my_type/AXBXHlWdGy6roZEZWR9P
{ "_index": "my_index", "_type": "my_type", "_id": "AXBXHlWdGy6roZEZWR9P", "_version": 1, "found": true, "_source": { "id": 1102, "name": "Bob", "date": "2020-01-02" } }
只查看数据行内容
GET my_index/my_type/AXBXHlWdGy6roZEZWR9P/_source
只查看id 和 name 字段内容GET my_index/my_type/AXBXHlWdGy6roZEZWR9P/_source?_source=id,name
-
更新数据行
elasticsearch 的更新是标记旧文档为删除(在过后某个时间点删除),不可访问,创建一个新文档并索引。
(1)更新整行数据,方式与创建相同。
(2)单独更新某个字段PUT my_index/my_type/1/_update { "doc":{ "id":1103 } }
六、结果解析
GET my_index/_search
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "AXBXHlWdGy6roZEZWR9P",
"_score": 1,
"_source": {
"id": 1102,
"name": "Bob",
"date": "2020-01-02",
"like": "banana and pear"
}
},
{
"_index": "my_index",
"_type": "my_type",
"_id": "1",
"_score": 1,
"_source": {
"id": 1101,
"name": "Alice",
"date": "2020-01-01",
"like": "apple and orange"
}
}
]
}
}
- took
整个搜索请求花费的毫秒数。 - timed_out
查询超时与否。可以进行限制GET /_search?timeout=10ms
或GET /_search?timeout=1s
, 将返回在请求超时前收集到的结果。(需要注意的是 timeout 不会停止执行查询,它仅仅告诉你目前顺利返回结果的节点然后关闭连接。在后台,其他分片可能依旧执行查询,尽管结果已经被发送) - _shards
参与查询的分片数( total 字段),有多少是成功的( successful 字段),有多少的是失败的( failed 字段) - hits
total 字段来表示匹配到的文档总数;
max_score 指的是所有文档匹配查询中 _score 的最大值;
hits 数组默认包含了匹配到的前10条数据。每个节点都有一个 _score 字段,这是相关性得分,它衡量了文档与查询的 匹配程度,数组按照 _score 降序排列。可以使用size
和from
设置返回结果数和偏移量GET my_index/_search?size=1&from=1
七、搜索-简易查询字符串
不建议直接暴露查询字符串搜索给用户,除非这些用户对于你的数据和集群可信。
- 字段 like 包含 apple
GET my_index/my_type/_search?q=like:apple
- 字段 name 包含 Alice 或者 字段 id 为 1102
GET my_index/_search?q=+name:Alice +id:1102
- 字段 name 包含 Alice 或者 字段 id 不为 1103
GET my_index/_search?q=+name:Alice -id:1103
- 字段 name 包含 Alice 或包含 Bob
GET my_index/my_type/_search?q=name:(Alice Bob)
- 字段 date >= ‘2020-01-02’
GET my_index/my_type/_search?q=date:>=2020-01-02
八、搜索-结构化查询
GET 提交查询请求更好,但因为 GET 携带交互数据不被很好支持,因此 search API 也支持 POST。
- term 过滤。用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串。
POST my_index/my_type/_search { "query": { "term": { "id": 1102} } }
- terms过滤。类似 term,字段指定多个值,相当于 in 。
POST my_index/my_type/_search { "query": { "terms": { "id": [1102, 1103]} } }
- range过滤。范围查找。
POST my_index/my_type/_search { "query": { "range": { "date": { "gte": "2020", "lt": "2020-01-02" } } } }
- match查询
做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据.POST my_index/my_type/_search { "query": { "match": { "like": "apple"} } }
- multi_match查询
POST my_index/my_type/_search { "query": { "multi_match": { "like": ["apple", "banana"]} } }
- 其他
size 和 from
只返回特定字段POST my_index/my_type/_search { "query": { }, "size": 1, "from": 0 }
POST my_index/my_type/_search { "query": { }, "_source": ["id", "name"] }
三、安装ik中文分词器
-
通过
elasticsearch-plugin
安装,注意elasticsearch版本号和ik版本号对应,本次安装版本号5.6.15
/usr/local/Cellar/[email protected]/5.6.15/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.15/elasticsearch-analysis-ik-5.6.15.zip
-
停止elasticsearch, 使用启动方式二重新启动。在启动信息中找到加载ik这一行
-
brew info elasticsearch
查看相关信息目录,找到
Config: /usr/local/etc/elasticsearch/
进入目录cd /usr/local/etc/elasticsearch/analysis-ik
,其中 IKAnalyzer.cfg.xml文件为配置字典文件