SpringCloud(七.4)ES(elasticsearch)-- DSL查询语法

DSL查询语法

 

1、查询所有

以下是简写和全写

 总结:

 

 2、全文检索查询(match)

全文检索查询,会对用户输入内容分词,常用于搜索框搜索:

 回顾在 SpringCloud(七.3)ES(elasticsearch)-- RestClient操作 中创建索引时添加的 all 字段,以及字段拷贝 copy_to。这里all字段就派上了用场。

 

match查询

match查询:全文检索查询的一种,会对用户输入的内容分词,然后去倒排索引库检索,语法如下:

#match查询
GET /hotel/_search
{
  "query": {
    "match": {
      "字段名": "检索内容"
    }
  }
}

示例: 这样ES会根据字段拷贝copy_to 的三个字段(名称、品牌、城市)中去检索“外滩”,并返回数据。

#match查询
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "外滩"
    }
  }
}

结果如图:

 

multi_match查询(多字段查询)

multi_match查询,与match查询类似,只不过允许同时查询多个字段,但是要注意!查询的字段越多,性能越差,推荐使用match查询。

语法如下:

#multi_match查询
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "要检索的内容",
      "fields": ["字段1","字段2","字段3"]
    }
  }
}

示例:在名称、品牌、商圈三个字段中检索“外滩”。

#multi_match查询
GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "要检索的内容",
      "fields": ["name","brand","business"]
    }
  }
}

结果如图:

 

3、精确查询

精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有

  • term:根据词条精确值查询。(如:品牌、城市、酒店星级等等)
  • range:根据值的范围查询。(如:价格、日期等等)

 term语法如下:

#term查询
GET /hotel/_search
{
  "query": {
    "term": {
      "字段名": {
        "value": "查询内容"
      }
    }
  }
}

示例:查询 城市 在 上海 的酒店数据

#term查询
GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "上海"
      }
    }
  }
}

结果如图:

 

range语法如下:

gt -- 大于     gte -- 大于等于      lt -- 小于     lte -- 小于等于

#range查询
GET /hotel/_search
{
  "query": {
    "range": {
      "字段名": {
        "gte": 大于等于值,
        "lte": 小于等于值
      }
    }
  }
}

示例:查询 价格 在 200-300 元区间的酒店信息

#range查询
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 200,
        "lte": 300
      }
    }
  }
}

结果如图:

 

 

4、地理查询

示例:

#distance查询
GET /hotel/_search
{
  "query": {
    "geo_distance":{
      "distance":"2km",
      "location":"31.21,121.5"
    }
  }
}

 

 

 

 

 

 

 

5、复合查询

复合(compound)查询:复合查询可以将其它简单查询组俣起来,实现更复杂的搜索逻辑,例如:

 

1)function score (BM25算法)

算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价。

 

 

 

 

 

 

all 字段拷贝copy_to 的三个字段(名称、品牌、城市)中去检索含有“外滩”字样的酒店数据。

#match查询
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "外滩"
    }
  }
}

加function score查询

#function score查询
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "外滩"
        }
      },
      "functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          }, 
          "weight": 2
        }
      ],
      "boost_mode": "sum"
    }
  }
}

效果对比展示:

match查询结果显示顺序如下:

 function score查询结果显示顺序如下:可以看出影响了默认source评分,如家评分加了2显示在了第一位!

 将weight改为10,让效果更为突显一点,如下:

 

 

 

2)Boolean Query

 

如图:搜索框的内容放到must 参与算分,下面的过滤条件 品牌、条件 可以放到 must_not 或 filter 中 不参数算分。提高性能。

注意事项:must_not 是必须不匹配,所以这里用的是 gt (大于) 

gt -- 大于     gte -- 大于等于      lt -- 小于     lte -- 小于等于

#bool查询
GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "name": {
            "value": "如家"
          }
        }}
      ],
      "must_not": [
        {"range": {
          "price": {
            "gt": 400
          }
        }}
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": "10km",
            "location": {
              "lat": 31.21,
              "lon": 121.5
            }
          }
        }
      ]
    }
  }
}

效果展示:

 

 

多字段filter写法

 

posted @ 2024-04-18 12:11  一介桃白白  阅读(4)  评论(0编辑  收藏  举报