这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战;
备注:继Elasticsearch笔记(6)
DSL基本语法
QueryString用的很少,一旦参数复杂就难以构建,所以大多查询都会使用dsl来进行查询更好。
- Domain Specific Language
- 特定领域语言
- 基于JSON格式的数据查询
- 查询更灵活,有利于复杂查询
DSL格式语法:
# 查询
POST /{index}/_doc/_search
{
"query": {
"match": {
"字段名": "查询值"
}
}
}
# 判断某个字段是否存在
POST /{index}/_doc/_search
{
"query": {
"exists": {
"field": "字段名"
}
}
}
- 语法格式为一个json object,内容都是key-value键值对,json可以嵌套。
- key可以是一些es的关键字,也可以是某个field字段
搜索不合法问题定位
DSL查询的时候经常会出现一些错误查询,出现这样的问题大多都是json无法被es解析,他会像java那样报一个异常信息,根据异常信息去推断问题所在,比如json格式不对,关键词不存在未注册等等,甚至有时候不能定位问题直接复制错误信息到百度一搜就能定位问题了。
查询所有与分页
- 查询所有
使用
#GET /{index}/_doc/_search
或者
#POST /{index}/_doc/_search
{
"query": {
"match_all": {}
},
"_source": ["id", "nickname", "age"] #代表只显示的参数
}
分页查询 默认查询是只有1条记录,可以通过分页来展示
#POST /{index}/_doc/_search
#POST http://192.168.123.64:9200/jacuesh/_doc/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 1
}
#查询结果
{
"took": 459,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 4,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3, ##总数3个
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "jacuesh",
"_type": "_doc",
"_id": "1002\n",
"_score": 1.0,
"_source": {
"id": 1002,
"age": 21,
"username": "刘某鹏",
"nickname": "鹏鹏",
"comefrom": "河北省邯郸市",
"sex": 1,
"birthday": "1998-10-21",
}
}
]
}
}
#### DSL搜索 - term/match
##### term精确搜索与match分词搜索
term搜索的时候会把用户搜索内容,比如“黄某人真帅”作为一整个关键词去搜索,而不会对其进行分词后再搜索
```json
#POST /{索引}/_doc/_search
{
"query": {
"term": {
"desc": "黄某人真帅"
}
}
}
对比
{
"query": {
"match": {
"desc": "黄某人真帅"
}
}
}
- term
跳跃搜索 - match_phrase
match:分词后只要有匹配就返回,match_phrase:分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)
-
slop:允许词语间跳过的数量
POST /{index}/_doc/_search { "query": { "match_phrase": { "comfrom": { "query": "广 汕", "slop": 2 } } } }