ElashSearch 基础语法-8.0
1、CRUD
创建索引
索引与数据库中的表类似
#语法 PUT /索引名称
PUT /test_index
删除索引
#删除索引
DELETE /test_index
向索引中插入数据
#方法1、手动设置ID (如果已经存在相同的ID,则执行更新操作)
# PUT /索引名称/_doc/id值
PUT /test_index/_doc/1
{
"name":"zhangsan",
"age":"12"
}
#方法2、自动设置ID 使用POST提交
#POST /索引名称/_doc
POST /test_index/_doc
{
"name":"zhangsan",
"age":"12"
}
删除指定索引的数据
#删除索引数据 DELETE /索引名称/_doc/ID值
DELETE /test_index/_doc/1
#删除多条数据 ID值用逗号隔开(,)
DELETE /test_index/_doc/1,2,3,4
2、查询
查询索引下的所有数据
# GET /索引名称/_search (包含查询信息)
GET /test_index/_search
# 查询索引下某一ID值 (只返回数据内容)
GET /test_index/_doc/1
查询超时设置
超时机制,假设,查询1万条数据。需要10毫秒,设置超时时间为1毫秒,当到达超时时间后,立即停止查询,并返回当前查询到的数据
#方法1: 通过参数进行设置(注意;超时单位 s/ms/m)
GET /test_index/_search?timeout=1ms
#方法2: 在消息体中设置(注意;超时单位)
GET /test_index/_search
{
"timeout": "1ms"
}
URL中带参数查询
#get /索引/_search?q=对象属性名:值
GET /test_index/_search?q=age:45
分页查询
# GET /索外名称/_search?
# from=起始条数
# size=每页多少数据
# sort=排序规则:asc或desc (注意mapping中的字段类型,部分类型不允许排序)
GET /test_index/_search?from=0&size=2&sort=age.keyword:desc
#显示如下错误,代表字段类型不允许排序
Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [age] in order to load field data by uninverting the inverted index. Note that this can use significant memory
3、 查询DSL
匹配所有
#match_all 查询所有数据
GET /test_index/_search
{
"query": {
"match_all": {}
}
}
单字段匹配match
#match 中设置相关的字段与数据
#match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找
GET /test_index/_search
{
"query": {
"match": {
"name": "my name is bl"
}
}
}
match匹配完成后会将"my name is bl"分成 my name is bl 4个词进行查找。
单字段匹配term
#term 会直接对关键词进行查找
#如: my name is bl 会直接当成一个词“my name is bl”
# match 会分成4个词
GET /test_index/_search
{
"query": {
"term": {
"name": "zhang"
}
}
}
多字段匹配multi_match
# 多个字段根据query中的内容进行匹配
# 如下:
# 分别查询 name字段和desc字段中包含 query查询中的内容 (内容作分词处理)
GET /test_index/_search
{
"query": {
"multi_match": {
"query": "查询的内容",
"fields": ["name","desc"]
}
}
}
排序sort
#sort 排序
GET /test_index/_search
{
"sort": [
{
"age.keyword": {
"order": "desc"
}
}
]
}
返回指定的字段_source
#设置查询返回的字段内容
# 只返回name和age字段
GET /test_index/_search
{
"query": {
"match_all": {}
},
"_source": [
"name","age"
]
}
分页查询 from fro
# from,起始条数 总共多少条数据
GET /test_index/_search
{
"from": 0,
"size": 10
}
match_phrase 短语搜索
# match_phrase 将数据分词后进行搜索的
# 1、目标文档需要包含分词后的所有词
# 2、目标文档还要保持这些词的相对顺序和文档中的一致
# 3、只有当这三个条件满足,才会命中文档!
#
# 而不像 match那样,将"li zhang san"分成三个词进行探索
GET /test_index/_search
{
"query": {
"match_phrase": {
"name": "li zhang san"
}
}
}
4、 查询和过滤
must:必须满足子句(查询)必须出现在匹配的文档中,并将有助于得分。
filter:过滤器不计算相关分数 子句(查询)必须出现在匹配的文档中。但是不像 must查询的分数将被忽略。Filter子句在filter上下文中执行,这意味着计分被忽略,并且子句被考虑用于缓存。
should:可能满足 子句(查询)应出现在匹配的文档中。
must_not:必须不满足 不计算相关度分数 子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为用于缓存。由于忽略计分,0因此将返回所有文档的分数。
minimum_should_match 参数指定should返回的文档必须匹配的子句的数量或百分比。如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。否则,默认值为0
例:#首先筛选name包含“xiaomi phone”并且价格大于1999的数据(不排序),#然后搜索name包含“xiaomi”and desc 包含“shouji”
GET /test_index/_search
{
"query": {
"bool": {
"must": [ # name 包含xiaomi and desc包含 shouji
{
"match": {
"name": "xiaomi"
}
},
{
"match": {
"desc": "shouji"
}
}
],
"filter": [ # name中包含 "xiaomi phone" and 价格大于 1999
{
"match_phrase":{
"name":"xiaomi phone"
}
},
{
"range": {
"price": {
"gte": 1999
}
}
}
]
}
}
}
#bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999
GET /product/_search
{
"query": {
"bool":{
#name中必须不能包含“erji”
"must": [
{"match": { "name": "xiaomi"}}
],
#name中必须包含“xiaomi”
"must_not": [
{"match": { "name": "erji"}}
],
#should中至少满足0个条件,参见下面的minimum_should_match的解释
"should": [
{"match": {
"desc": "nfc"
}}
],
#筛选价格大于4999的doc
"filter": [
{"range": {
"price": {
"gt": 4999
}
}}
]
}
}
}
Highlight search 显示
GET /test_index/_search
{
"query": {
"match": {
"name": "zhang"
}
},
"highlight": {
"fields": {
"name": {
"pre_tags": [
"<h1>"
],
"post_tags": [
"</h1>"
]
}
}
}
}
scroll search
游标查询:查询完成后返回scroll_id,在指定时间范围内,根据scroll_id即可查询下一组数据
#第一次返回内容
GET /test_index/_search?scroll=1m
{
"size": 1
}
#第一次返回内容
{
"_scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFlozTXlNbXlzUXYtdklzQWtvVHcxeWcAAAAAAABt3hZqeV9pWEh4cVROcUtDVXMzWHB0cjdR",
"took" : 0,
"timed_out" : false,
#其他返回内容忽略
}
#第二次查询,直接根据scroll_id进行查询
GET /_search/scroll
{
"scroll":"1m",
"scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFlozTXlNbXlzUXYtdklzQWtvVHcxeWcAAAAAAABt3hZqeV9pWEh4cVROcUtDVXMzWHB0cjdR"
}
#第二次返回内容
{
"_scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFlozTXlNbXlzUXYtdklzQWtvVHcxeWcAAAAAAABt3hZqeV9pWEh4cVROcUtDVXMzWHB0cjdR",
"took" : 20,
"timed_out" : false,
#其他返回内容忽略
}