DSL特点
- Domain Specific Language
- 特定领域语言
- 基于JSON格式的数据查询
- 查询更灵活,有利于复杂查询
# 查询
POST /索引/_doc/_search
{
"query": {
"match": {
"desc": "Elasticsearch"//查询条件 Desc字段中带有Elasticsearch的会查询出来
}
}
}
# 判断某个字段是否存在
{
"query": {
"exists": {
"field": "desc"
}
}
}
注意:语法法格式为一个json object,内容都是key-value键值对,json可以嵌套。key可以是一些es的关键字,也可以是某个field字段。
查询索引中所有的文档
POST /索引/_doc/_search
{
"query": {
"match_all": {}
},
"_source": ["id", "nickname", "age"]
}
分页查询
默认查询是只有10条记录,可以通过分页来展示
POST /索引/_doc/_search
{
"query": {
"match_all": {}
},
"from": 0,
"size": 10
}
{
"query": {
"match_all": {}
},
"_source": [
"id",
"nickname",
"age"
],
"from": 5,
"size": 5
}
term精确搜索与match分词搜索
- match会对中华人民共和国先进行分词(其实就是全文检索),在查询。
- 而term则不会,直接把中华人民共和国作为一个整的词汇去搜索。
POST /索引/_doc/_search
{
"query": {
"term": {
"desc": "中华人民共和国"
}
}
}
对比
{
"query": {
"match": {
"desc": "中华人民共和国"
}
}
}
terms多个词语匹配检索
相当于是tag标签查询。
POST /索引/_doc/_search
{
"query": {
"terms": {
"desc": ["中华人", "人民", "共和国"]
}
}
}
match_phrase短语匹配
match:分词后只要有匹配就返回,match_phrase :分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)
slop :允许词语间跳过的数量
POST /shop/_doc/_search
{
"query": {
"match_phrase": {
"desc": {
"query": "中华 人民 共和国",
"slop": 2
}
}
}
}
根据文档主键ids搜索
POST /索引/_doc/_search
{
"query": {
"ids": {
"type": "_doc",
"values": ["1001", "1010", "1008"]
}
}
}
operator
- or:搜索内容分词后,只要存在一个词语匹配就展示结果
- and:搜索内容分词后,都要满足词语匹配
{
"query": {
"match": {
"desc": {
"query": "中华人民",
"operator": "or"
}
}
}
}
# 相当于 select * from 索引 where desc='中华' or|and desc='人民'
- mininmum_should_match:最低匹配精度,至少有分词后的词语个数x百分百,得出一个数据值取整。举个例子∶当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照10X7O%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则8x70%=5.5,则desc中至少需要有5个词语匹配,就展示。
- minimum_should_match也能设置具体的数字,表示个数
POST /索引/_doc/_search
{
"query": {
"match": {
"desc": {
"query": "中华人民共和国",
"minimum_should_match": "60%"
}
}
}
}
multi_match
满足使用match在多个字段中进行查询的需求
POST /索引/_doc/_search
{
"query": {
"multi_match": {
"query": "中华人民共和国",//查询内容
"fields": ["desc", "nickname"]//需要在哪些字段中chax
}
}
}
boost
权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高.
POST /索引/_doc/_search
{
"query": {
"multi_match": {
"query": "中华人民共和国",
"fields": ["desc", "nickname^10"]
}
}
}
注意:nickname^10代表搜索提升1倍相关性,也就是说用户搜索的时候其实以这个nickname为主,desc为辅, nickoame的匹配相关度当然要提高权重比例了。
boost为指定词语加权重
POST /索引/_doc/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"desc": {
"query": "中华",
"boost": 18
}
}
},
{
"match": {
"desc": {
"query": "人民",
"boost": 2
}
}
}
]
}
}
}
post_filter 过滤器
对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。
post_filter 元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会相据分数去排序,query则相反,会计算分数,也会按照分数去排序。
-
query:根据用户搜索条件检索匹配记录
-
post_filter :用于查询后,对结果数据的筛选
-
gte :大于等于
-
lte : 小于等于
-
gt:大于
-
lt:小于
POST /索引/_doc/_search
{
"query": {
"match": {
"desc": "苹果手机"
}
},
"post_filter": {
"range": {
"money": {
"gt": 4000,
"lt": 8000
}
}
}
}
高亮highlight
POST /索引/_doc/_search
{
"query": {
"match": {
"desc": "中华人民共和国"
}
},
"highlight": {
"pre_tags": ["<tag>"],//自定义高亮标签-开始
"post_tags": ["</tag>"],//自定义高亮标签-结束
"fields": {
"desc": {}
}
}
}