首页 > 其他分享 >微服务之分布式搜索引擎elasticsearchDSL查询功能

微服务之分布式搜索引擎elasticsearchDSL查询功能

时间:2022-12-02 15:57:36浏览次数:47  
标签:search elasticsearchDSL GET 搜索引擎 score query 查询 match 分布式

DSL Query的分类

Elasticsearch提供了基于JSON的DSL(Domain Specific  Language)来定义查询。常见的查询类型包括:

查询所有:查询出所有数据,一般测试用。例如:match_all

全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:

match_query

multi_match_query

精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:

ids
range
term

地理(geo)查询:根据经纬度查询。例如:

geo_distance
geo_bounding_box

复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:

bool
function_score

DSL Query基本语法

查询的基本语法如下:

GET /indexName/_search
{
  "query": {
    "查询类型": {
      "查询条件": "条件值"
    }
  }
}
// 查询所有
GET /indexName/_search
{
  "query": {
    "match_all": {
    }
  }
}

全文检索查询:

// match查询:全文检索查询的一种,根据一个字段查询,会对用户输入内容分词,然后去倒排索引库检索,语法:
GET /indexName/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  }
}

// multi_match:与match查询类似,只不过允许同时查询多个字段,参与查询字段越多,查询性能越差语法:
GET /indexName/_search
{
  "query": {
    "multi_match": {
      "query": "TEXT",
      "fields": ["FIELD1", " FIELD12"]
    }
  }
}

精确查询:

// 精确查询常见的有term查询和range查询。语法如下:
// term查询,根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段
GET /indexName/_search
{
  "query": {
    "term": {
      "FIELD": {
        "value": "VALUE"
      }
    }
  }
}

// range查询。根据数值范围查询,可以是数值、日期的范围
GET /indexName/_search
{
  "query": {
    "range": {
      "FIELD": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

地理查询:

// geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
GET /indexName/_search
{
  "query": {
    "geo_bounding_box": {
      "FIELD": {
        "top_left": {
          "lat": 31.1,
          "lon": 121.5
        },
        "bottom_right": {
          "lat": 30.9,
          "lon": 121.7
        }
      }
    }
  }
}
// geo_distance: 查询到指定中心点小于某个距离值的所有文档
GET /indexName/_search
{
  "query": {
    "geo_distance": {
      "distance": "15km",
      "FIELD": "31.21,121.5"
    }
  }
}

复合查询:

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

fuction score:

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

// function score query:可以修改文档的相关性算分(query score),根据新得到的算分排序。
GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": { "match": {"all": "外滩"} },    // 原始查询条件,搜索文档并根据相关性打分(query score)      "functions": [        {
          "filter": {"term": {"id": "1"}}, // 过滤条件,符合条件的文档才会被重新算分
          "weight": 10  // 算分函数,算分函数的结果称为function score ,将来会与query score运算 weight:给一个常量值,作为函数结果,field_value_factor:用文档中的某个字段值作为函数结果,random_score:随机生成一个值,作为函数结果
              // script_score:自定义计算公式,公式结果作为函数结果
        }       ], "boost_mode": "multiply" //定义function score与query score的运算方式

                   // 包括: multiply:两者相乘。默认就是这个 replace:用function score 替换 query score 其它:sum、avg、max、min

    }
  }
}

Boolean Query:

布尔查询是一个或多个查询子句的组合。子查询的组合方式有: must:必须匹配每个子查询,类似“与” should:选择性匹配子查询,类似“或” must_not:必须不匹配,不参与算分,类似“非” filter:必须匹配,不参与算分

GET /hotel/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {"city": "上海" }}
      ],
      "should": [
        {"term": {"brand": "皇冠假日" }},
        {"term": {"brand": "华美达" }}
      ],
      "must_not": [
        { "range": { "price": { "lte": 500 } }}
      ],
      "filter": [
        { "range": {"score": { "gte": 45 } }}
      ]
    }
  }
}

 

搜索结果处理:

elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

排序:

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD": "desc"  // 排序字段和排序方式ASC、DESC
    }
  ]
}
——————————————————————————
GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance" : {
          "FIELD" : "纬度,经度",
          "order" : "asc",
          "unit" : "km"
      }
    }
  ]
}

分页:

elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。 elasticsearch中通过修改from、size参数来控制要返回的分页结果

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "from": 990, // 分页开始的位置,默认为0
  "size": 10, // 期望获取的文档总数
  "sort": [
    {"price": "asc"}
  ]
}
from + size:
优点:支持随机翻页
缺点:深度分页问题,默认查询上限(from + size)是10000
场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
after search:
优点:没有查询上限(单次查询的size不超过10000)
缺点:只能向后逐页查询,不支持随机翻页
场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
scroll:
优点:没有查询上限(单次查询的size不超过10000)
缺点:会有额外内存消耗,并且搜索结果是非实时的
场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 after search方案。

高亮:

就是在搜索结果中把搜索关键字突出显示

将搜索结果中的关键字用标签标记出来 在页面中给标签添加css样式

GET /hotel/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT"
    }
  },
  "highlight": {
    "fields": { // 指定要高亮的字段
      "FIELD": {
        "pre_tags": "<em>",  // 用来标记高亮字段的前置标签
        "post_tags": "</em>" // 用来标记高亮字段的后置标签
      }
    }
  }
}
// 完整语法
GET /hotel/_search {   "query": {     "match": {       "name": "如家"     }   },   "from": 0, // 分页开始的位置   "size": 20, // 期望获取的文档总数   "sort": [      {  "price": "asc" }, // 普通排序     {       "_geo_distance" : { // 距离排序           "location" : "31.040699,121.618075",            "order" : "asc",           "unit" : "km"       }     }   ],   "highlight": {     "fields": { // 高亮字段       "name": {         "pre_tags": "<em>",  // 用来标记高亮字段的前置标签         "post_tags": "</em>" // 用来标记高亮字段的后置标签       }     }   } }

 

标签:search,elasticsearchDSL,GET,搜索引擎,score,query,查询,match,分布式
From: https://www.cnblogs.com/Yukino1903/p/16944673.html

相关文章

  • .NET下实现分布式缓存系统Memcached
    【IT168技术文档】在Web应用程序中,数据通常保存在RDBMS中,应用服务器从数据库中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负载加重、数据......
  • 矩池云 | GPU 分布式使用教程之 Pytorch
    GPU分布式使用教程之PytorchPytorch官方推荐使用DistributedDataParallel(DDP)模块来实现单机多卡和多机多卡分布式计算。DDP模块涉及了一些新概念,如网络(WorldSize......
  • 【转】wcf系列学习5天速成——第四天 wcf之分布式架构
    wcf系列学习5天速成——第四天wcf之分布式架构 今天是wcf系列的第四天,也该出手压轴戏了。嗯,现在的大型架构,都是神马的,nginx鸡群,iis鸡群,wcf鸡群,DB鸡群,由一个人作......
  • ElasticSearch分布式集群
    前言关于ElasticSearch集群概念这里就不多废话了,详细可见ElasticSearch基本介绍、ElasticSearch集群系统架构单节点集群我们可以创建一个索引,为这个索引创建三个分片......
  • 搜索引擎之Lucene,Solr,ElasticSearch比较
    目录1搜索引擎1.1简介1.2结构化数据和非结构化数据1.3使用全文搜索引擎条件2Lucene,Solr,ElasticSearch2.1Lucene2.2Solr2.3ElasticSearch2.4区别和选择2.4.1如何......
  • 分布式锁-redission锁重试和WatchDog机制
    抢锁过程中,获得当前线程,通过tryAcquire进行抢锁,该抢锁逻辑和之前逻辑相同1、先判断当前这把锁是否存在,如果不存在,插入一把锁,返回null2、判断当前这把锁是否是属于当前线......
  • 分布式锁-redission可重入锁原理
    在Lock锁中,他是借助于底层的一个voaltile的一个state变量来记录重入的状态的,比如当前没有人持有这把锁,那么state=0,假如有人持有这把锁,那么state=1,如果持有这把锁的人再次持......
  • 1+N环境-分布式数据库mysql8系列故障重启问题处理
    1、背景多个业务连接异常,navicat连接数据库不稳定,连接进入数据库后也会出现卡死的,连接失败的报错2、问题分析2.1 问题描述:navicat、服务器中连接数据库均复现业务报告......
  • PolarDB-X 分布式数据库初体验
    目录1.什么是分布式数据库2.PolarDB-X是什么样的存在2.1产品架构2.2物理拓扑3.部署PolarDB-X3.1安装PXD3.2部署PolarDB-X4.参考1.什么是分布式数据库分布式数据库......
  • 分布式缓存Redis
    RDB持久化AOF持久化 区别  redis主从架构                       ......