初始化数据
POST /my_store/products/_bulk
{ "index": { "_id": 1 }}
{ "price" : 10, "productID" : "XHDK-A-1293-#fJ3" }
{ "index": { "_id": 2 }}
{ "price" : 20, "productID" : "KDKE-B-9947-#kL5" }
{ "index": { "_id": 3 }}
{ "price" : 30, "productID" : "JODL-X-1937-#pV7" }
{ "index": { "_id": 4 }}
{ "price" : 30, "productID" : "QQPX-R-3956-#aD8" }
{ "index": { "_id": 5 }}
{ "price" : 30, "productID" : "QQPX-R-3956-#aD1" }
{ "index": { "_id": 6 }}
{ "price" : 40, "productID" : "QQPX-R-3956-#aD1" }
{ "index": { "_id": 7 }}
{ "price" : 40, "productID" : "QQPX-R-3956-#aD1","aihao":"da lan qiu" }
{ "index": { "_id": 8 }}
{ "price" : 40, "productID" : "QQPX-R-3956-#aD1","aihao":"da lan ban" }
{ "index": { "_id": 9 }}
{ "price" : 40, "productID" : "QQPX-R-3956-#aD1","aihao":"da lan a qiu" }
POST /student/s1/_bulk
{"index":{"_id":1}}
{"name":"张1","age":18,"nikename":"小张1"}
{"index":{"_id":2}}
{"name":"张2","age":19,"nikename":"小张2"}
{"index":{"_id":3}}
{"name":"张3","age":18,"nikename":"小张3"}
{"index":{"_id":4}}
{"name":"张4","age":20,"nikename":"小张4"}
{"index":{"_id":5}}
{"name":"张5","age":125,"nikename":"小张5"}
{"index":{"_id":6}}
{"name":"张6","age":20,"nikename":"小张6"}
POST /dog/d1/_bulk
{"index":{"_id":1}}
{"name":"张1","age":18,"nikename":"小张1"}
{"index":{"_id":2}}
{"name":"张2","age":19,"nikename":"小张2"}
{"index":{"_id":3}}
{"name":"张3","age":18,"nikename":"小张3"}
{"index":{"_id":4}}
{"name":"张4","age":20,"nikename":"小张4"}
{"index":{"_id":5}}
{"name":"张5","age":125,"nikename":"小张5"}
{"index":{"_id":6}}
{"name":"张6","age":20,"nikename":"小张6"}
{"index":{"_id":7}}
{"name":"李7","age":20,"nikename":"小李7"}
{"index":{"_id":8}}
{"name":"李8","age":20,"nikename":"小李8"}
{"index":{"_id":9}}
{"name":"李啊哈","age":20,"nikename":"小李啊哈"}
{"index":{"_id":10}}
{"name":"li10","age":80,"nikename":"小李啊哈","backAge":20}
查询(文档)
基于url实现查询
获取索引类型下的所有数据
GET /dog/d1/_search
根据条件进行查询
?q=字段名:字段值
GET /dog/d1/_search?q=name:李7
基于QueryDSL实现查询
Query Core <font color=red>查询核心</font>
match_all 查询所有
match_all 查询简单的匹配所有文档。在没有指定查询方式时,它是默认的查询:
{ "match_all": {}}
它经常与 filter 结合使用—例如,检索收件箱里的所有邮件。所有邮件被认为具有相同的相关性,所以都将获得分值为 1 的中性 _score。
match 根据条件查询
无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。
{"match":{"filename":"value"}}
multi_match 多字段查询
{
"multi_match": {
"query": "full text search",
"fields": [ "title", "body" ]
}
}
range 范围查询
标识 | 含义 |
---|---|
gt | 大于 |
gte | 大于等于 |
lt | 小于 |
lte | 小于等于 |
GET /dog/d1/_search
{
"query":{
"range": {
"age": {
"gte": 10
}
}
}
}
term 精确查询
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件
GET /dog/d1/_search
{
"query":{
"term": {
"age": 18
}
}
}
trems 相当于数据库的IN只要满足一个就可以返回
GET /dog/d1/_search
{
"query":{
"terms": {
"age": [18, 19]
}
}
}
exists 存在指定属性的时候才会返回
GET /dog/d1/_search
{
"query":{
"exists": {
"field": "backAge"
}
}
}
空查询(查询es内所有的数据)
GET /_search
{
"query": {
"match_all": {}
}
}
条件查询
match: 模糊查询
GET /dog/d1/_search
{
"query": {
"match": {
"name": "李"
}
}
}
短语查询(精确匹配)
match_phrase : 短语查询
GET /dog/d1/_search
{
"query":{
"match_phrase": {
"nikename": "小李"
}
}
}
多字段匹配查询
multi_match: 多字段查询
GET /dog/d1/_search
{
"query":{
"multi_match": {
"query": "20",
"fields": ["age","backAge"]
}
}
}
复合查询
关键字 | 含义 |
---|---|
must | 文档 必须 匹配这些条件才能被包含进来。 |
must_not | 文档 必须不 匹配这些条件才能被包含进来。 |
should | 如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。 |
filter | 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。 |
GET /dog/d1/_search
{
"query":{
"bool": {
"must": [
{
"match_phrase": {
"name": "张"
}
}
],
"must_not": [
{
"match_phrase": {
"age": 20
}
}
],
"should": [
{
"match": {
"age": 20
}
}
],
"filter": [
{
"range": {
"age": {
"gt": 18
}
}
}
]
}
}
}
增加过滤器查询
filter:过滤器
range:范围
gt:大于
GET /dog/d1/_search
{
"query":{
"bool": {
"must": [
{
"match_phrase": {
"name": "张"
}
}
],
"must_not": [
{
"match_phrase": {
"age": 20
}
}
],
"should": [
{
"match": {
"age": 20
}
}
],
"filter": [
{
"range": {
"age": {
"gt": 30
}
}
}
]
}
}
}
constant_score
查询也是你工具箱里有用的查询工具。它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。
可以使用它来取代只有 filter 语句的 bool 查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。
GET /student/s1/_search
{
"query":{
"constant_score": {
"filter": {
"exists": {
"field": "name"
}
},
"boost": 1.2
}
}
}
获取多个索引下的指定ID数据
GET /_mget
{
"docs" : [
{
"_index" : "student",
"_type" : "s1",
"_id":1
},
{
"_index":"dog",
"_type":"d1",
"_id":1
}
]
}
获取单个索引下指定ID字段
GET /student/s1/_mget
{
"docs" : [
{
"_id":1
}
]
}
查询多个(类似数据库in)
GET /student/s1/_mget
{
"ids":[1,5,2]
}
查询分页
from 从第几条开始
size 展示多少条
GET /student/s1/_search
{
"from":0,
"size":2
}
排序
age :为需要排序的字段名
order:排序方式 asc 从小到大 desc 从大到小
GET /dog/d1/_search
{
"sort":{
"age":{
"order":"asc"
}
}
}
多个字段排序
GET /dog/d1/_search
{
"sort":{
"age":{
"order":"desc"
},
"backAge":{
"order":"desc"
}
}
}
修改(文档)
基于DSL进行修改<font color=red>修改时需将所有列填充</font>
POST /dog/d1/1
{
"name":"张11"
}
基于 DSL (<font color=red>也会将原有列覆盖</font>)
POST /dog/d1/1
{
"_doc":{
"name":"张1"
}
}
删除(文档)
删除
DELETE /dog/d1/1
新增(文档)
批量新增
基于_bulk实现
POST /dog/d1/_bulk
{"index":{"_id":1}}
{"name":"张1","age":18,"nikename":"小张1"}
{"index":{"_id":2}}
{"name":"张2","age":19,"nikename":"小张2"}
新增单个
POST /dog/d1/1
{
"name":"张11"
}
锁
类似于数据库的乐观锁
通过前置查询_seq_no与primary_term
_seq_no:修改时就会递增
POST /student/s1/1?if_seq_no=9&if_primary_term=1
{
"name" : "张1",
"age" : 18,
"nikename" : "小aa张1"
}
校验
_validate-query API 可以用来验证查询是否合法
GET /dog/d1/_validate/query
{
"age": {
"term": 18
}
}
explain 打印错误信息
GET /dog/d1/_validate/query?explain
{
"age": {
"term": 18
}
}
explain 打印查询如何被解析
GET /_validate/query?explain
{
"query":{
"match_all": {}
}
}
索引
<font color=red>禁止自动索引创建:在配置文件中配置
action.auto_create_index: false</font>
索引配置
分片配置
新增
number_of_shards
每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。
number_of_replicas
每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。
创建只有 一个主分片,没有副本的小索引:
PUT /my_temp_index
{
"settings": {
"number_of_shards" : 1,
"number_of_replicas" : 0
}
}
修改
可以用 update-index-settings API 动态修改副本数
PUT /my_temp_index/_settings
{
"number_of_replicas": 1
}
索引创建
PUT /cms
索引删除
删除单个
删除单个 : DELETE /cms
删除多个:
删除多个
DELETE /index_one,index_two
DELETE /index_*
删除所有
对一些人来说,能够用单个命令来删除所有数据可能会导致可怕的后果。如果你想要避免意外的大量删除, 你可以在你的 elasticsearch.yml 做如下配置:
action.destructive_requires_name: true
这个设置使删除只限于特定名称指向的数据, 而不允许通过指定 _all 或通配符来删除指定索引库。
DELETE /_all
DELETE /*
其他
查看集群健康
GET /_cluster/health
检查文档是否存在
HEAD /dog/d1/1
理论
文档存储规则
集群环境下文档的分发规则
shard = hash(routing) % number_of_primary_shards
routing = 文档Id
number_of_primary_shards = 主分片数量
倒排索引
将文档根据内容进行分词,查询时根据匹配度返回匹配度最高的数据,其次匹配较低的
文档1:asd asdc asdcde
文档2:asd asdc asdcde asds
词条 | 文档1 | 文档2 |
---|---|---|
asd | x | x |
asdc | x | x |
asdcde | x | x |
asds | x | x |
分析与分词器
分析
1、将文档分成适合于倒排索引的的独立的词条。
2、将词条统一进行格式化提高搜索性。
分析器包含以下三个功能
字符过滤器
首先,字符串按顺序通过每个 字符过滤器 。他们的任务是在分词前整字符串。一个字符过滤器可以用来去掉HTML,或者将 & 转化成 and。
分词器
以固定的分隔符将字符串进行分割,分割成单独的词条
Token过滤器
词条按顺序通过每个 token 过滤器 。这个过程可能会改变词条(例如小写化 Quick ),删除词条(例如, 像 a, and, the 等无用词),者增加词条(例如,像 jump 和 leap 这种同义词)。
es内置分词器
Set the shape to semi-transparent by calling set_trans(5)
标准分析器
标准分析器是Elasticsearch默认使用的分析器。它是分析各种语言文本最常用的选择。它根据 Unicode联盟 定义的 单词边界 划分文本。删除绝大部分标点。最后,将词条小写。它会产生
set, the, shape, to, semi, transparent, by, calling, set_trans, 5
简单分词器
简单分析器在任何不是字母的地方分隔文本,将词条小写。它会产生
set, the, shape, to, semi, transparent, by, calling, set, trans
空格分析器
空格分析器在空格的地方划分文本。它会产生
Set, the, shape, to, semi-transparent, by, calling, set_trans(5)
语言分析器
特定语言分析器可用于 很多语言。它们可以考虑指定语言的特点。例如, 英语 分析器附带了一组英语无用词(常用单词,例如 and 或者 the ,它们对相关性没有多少影响),它们会被删除。 由于理解英语语法的规则,这个分词器可以提取英语单词的 词干 。
英语 分词器会产生下面的词条:
set, shape, semi, transpar, call, set_tran, 5
注意看 transparent、 calling 和 set_trans 已经变为词根格式。