1 term query - 索引词检索

1.1 term query - 不分词检索

term query: 把检索串当作一个整体来执行检索, 即不会对检索串分词.

term是完全匹配检索, 要用在不分词的字段上, 如果某个field在映射中被分词了, term检索将不起作用.

所以, 不分词的field, 要在mapping中设置为不分词.

—— ES 5.x之后, 为每个text类型的字段新增了名为keyword的子字段, 是不分词的, 默认保留256个字符.

—— 可以使用keyword字段进行term检索. 示例:

GET shop/_search
{
"query": {
"term": {
"name.keyword": "Java编程思想"
}
}
}

1.2 terms query - in检索

terms, 相当于多个term检索, 类似于SQL中in关键字的用法, 即在某些给定的数据中检索:

GET shop/_search
{
"query": {
"terms": {
"name.keyword": [
"Java编程思想", "Java并发编程的艺术"
]
}
}
}

2 prefix query - 前缀检索

prefix query, 就是前缀检索. 比如商品name中有多个以"Java"开头的document, 检索前缀"Java"时就能检索到所有以"Java"开头的文档.

—— 扫描所有倒排索引, 性能较差.

GET shop/_search
{
"query": {
"prefix": { "name": "java" }
}
}

3 wildcard query - 通配符检索

扫描所有倒排索引, 性能较差.

GET shop/_search
{
"query": {
"wildcard": { "name": "ja*" }
}
}

4 regexp query - 正则检索

扫描所有倒排索引, 性能较差.

GET shop/_search
{
"query": {
"regexp": { "name": "jav[a-z]*" }
}
}

5 fuzzy query - 纠错检索

fuzziness的默认值是2 —— 表示最多可以纠错两次.

说明: fuzziness的值太大, 将削弱检索条件的作用, 也就是说纠错次数太多, 就会导致限定检索结果的检索条件被改变, 失去了限定作用.

示例: 检索name中包含"Java"的文档, Java中缺失了一个字母a:

GET shop/_search
{
"query": {
"match": {
"name": {
"query": "Jav",
"fuzziness": 1,
"operator": "and"
}
}
}
}

6 boost评分权重 - 控制文档的优先级别

通过boost参数, 令满足某个条件的文档的得分更高, 从而使得其排名更靠前.

GET shop/_search
{
"query": {
"bool": {
"must": [
{ "match": { "name": "编程思想"} }
],
"should": [
{
"match": {
"name": {
"query": "艺术",
"boost": 2 // 提升评分权重
}
}
}
]
}
}
}

7 dis_max的用法 - best fields策略

一般检索中, 检索条件会被分词, bool检索构建多个子检索 (must | must_not | should | filter), 这些子检索可能会包含多个field. 这时:

多个子检索的field各自匹配少量关键字的文档的分数 > 某个子检索的field匹配大量关键字的文档的分数.

7.1 dis_max的提出

如果我们希望检索结果中 (检索串被分词后的) 关键字匹配越多, 这样的文档就越靠前, 而不是多个子检索中匹配少量分词的文档靠前.

⇒ 此时可以使用dis_max和tie_breaker.

tie_breaker的值介于0~1之间, Elasticsearch将 bool检索的分数 * tie_breaker的结果与dis_max的最高分进行比较, 除了取dis_max的最高分以外, 还会考虑其他的检索结果的分数.

7.2 使用示例

为了增加精准度, 常用的是配合boost、minimum_should_match等参数控制检索结果.

GET shop/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "name": "虚拟机" } },
{ "match": { "desc": "经典" } }
],
"tie_breaker": 0.2 // 对同时满足的文档的分值进行提升
}
}
} GET shop/_search
{
"query": {
"dis_max": {
"queries": [
{
"match": {
"name": {
"query": "虚拟机",
"minimum_should_match": "50%",
"boost": 2
}
}
},
{
"match": {
"desc": {
"query": "经典",
"minimum_should_match": "50%",
"boost": 3
}
}
}
],
"tie_breaker": 0.3
}
}
}

8 exist query - 存在检索, 已过期

这是Elasticsearch 2.x中的API, 后续版本不再支持.

9 复杂检索的使用范例

9.1 多条件过滤 - 包含

检索出版时间在2012-07之后, 且至少满足下述条件中一个的文档:

a. 名称(name)中包含"并发";

b. 描述(desc)中包含"java";

c. 出版社(publisher)名称中不包含"电子".

GET shop/_search
{
"query": {
"bool": {
"filter": { // 按时间过滤
"range": {
"date": {"gte": "2012-07"}
}
},
"should": [ // 可匹配, 可不匹配
{
"match": { "name": "并发" }
},
{
"bool": {
"must": { // 必须匹配
"match": { "desc": "java" }
},
"must_not": { // 不能匹配
"match": { "publisher": "电子" }
}
}
}
],
"minimum_should_match": 1 // 至少满足should中的一个条件
}
},
// 自定义排序
"sort": [
{ "price": { "order": "desc" } }
]
}

注意: 排序的字段最好是数字, 或日期, 因为字符串字段会被分词, ES会通过分词后的某个词去排序, 结果难以预测.

9.2 多条件拼接 - 包含+范围+排序

匹配检索: name中包含"java"却不包含"虚拟机";

范围检索: 价格大于50、小于80;

结果排序: 按照价格升序排序.

GET shop/_search
{
"query": {
"bool": {
"must": { // 必须匹配
"match": { "name": "java" }
},
"must_not": { // 必须不匹配
"match": { "name": "虚拟机" }
},
"filter": {
"range": {
"price": {
"gte": 40,
"lte": 80,
"boost": 2.0 // 设置得分的权重值(提升值), 默认是1.0
}
}
}
}
}
}

关于范围检索的使用, 请参考下篇文章: ES 22 - Elasticsearch对数值或日期类型进行范围检索

9.3 定制检索结果的排序规则

(1) 默认排序规则:

ES默认是按检索结果的分值(_score)降序排列的.

某些情况下, 可能存在无实际意义的_score, 比如filter时所有_score的值都相同:

GET website/_search
{
"query": {
"bool": {
"filter": {
"term": {
"author_id": 5520 // 此时所有符合条件的_score都为0
}
}
}
}
} // 或通过constant_score过滤:
GET website/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"author_id": 5520 // 此时所有符合条件的_score都为1
}
}
}
}
}

(2) 定制排序规则:

GET website/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"author_id": 5520
}
}
}
},
"sort": [
{
"post_date": { "order": "asc" }
}
]
}

版权声明

作者: 马瘦风(https://healchow.com)

出处: 博客园 马瘦风的博客(https://www.cnblogs.com/shoufeng)

感谢阅读, 如果文章有帮助或启发到你, 点个[好文要顶

ES 21 - Elasticsearch的高级检索语法 (包括term、prefix、wildcard、fuzzy、boost等)的更多相关文章

  1. Elasticsearch URI search 查询语法整理

    Elasticsearch URI search 一.请求体查询与空查询 1. 请求体查询(request body search) 简单查询语句(lite)是一种有效的命令行adhoc查询.但是,如 ...

  2. Elasticsearch实现类Google高级检索

    文章转载自: https://mp.weixin.qq.com/s?__biz=MzI2NDY1MTA3OQ==&mid=2247483914&idx=1&sn=436f814 ...

  3. ES 07 - Elasticsearch查询文档的六种方法

    目录 1 Query String Search(查询串检索) 2 Query DSL(ES特定语法检索) 3 Query Filter(过滤检索) 4 Full Text Search(全文检索) ...

  4. ES 32 - Elasticsearch 数据建模的探索与实践

    目录 1 什么是数据建模? 2 如何对 ES 中的数据进行建模 2.1 字段类型的建模方案 2.2 检索.聚合及排序的建模方案 2.3 额外存储的建模方案 3 ES 数据建模实例演示 3.1 动态创建 ...

  5. Google高级搜索语法

    Google高级搜索语法   Google搜索果真是一个强悍的不得了的搜索引擎,今天转了一些 google的高级搜索语法 希望能帮助到大家. 一.allinanchor: anchor是一处说明性的文 ...

  6. 【ES】ElasticSearch初体验之使用Java进行最基本的增删改查~

    好久没写博文了, 最近项目中使用到了ElaticSearch相关的一些内容, 刚好自己也来做个总结. 现在自己也只能算得上入门, 总结下自己在工作中使用Java操作ES的一些小经验吧. 本文总共分为三 ...

  7. ES 13 - Elasticsearch的元字段 (_index、_type、_source、_routing等)

    目录 1 标识元字段 1.1 _index - 文档所属的索引 1.2 _uid - 包含_type和_id的复合字段 1.3 _type - 文档的类型 1.4 _id - 文档的id 2 文档来源 ...

  8. Elasticsearch Java高级客户端

    1.  概述 Java REST Client 有两种风格: Java Low Level REST Client :用于Elasticsearch的官方低级客户端.它允许通过http与Elastic ...

  9. 用 mongodb + elasticsearch 实现中文检索

      而 elasticsearch 可以很好的支持各种语言的全文检索,但我们暂时又不想切换到 elasticsearch 作为后端数据库. 当然,可以在 web 应用中存储数据的时候,再主动写一份到 ...

随机推荐

  1. vue axios拦截器加全局loading

    import axios from 'axios' import util from './util' import {showFullScreenLoading, tryHideFullScreen ...

  2. Massively parallel supercomputer

    A novel massively parallel supercomputer of hundreds of teraOPS-scale includes node architectures ba ...

  3. CUDA二维纹理内存+OpenCV图像滤波

    CUDA和OpenCV混合编程,使用CUDA的纹理内存,实现图像的二值化以及滤波功能. #include <cuda_runtime.h> #include <highgui/hig ...

  4. CUDA查询和选取设备信息

    CUDA查询设备信息 CUDA C中的cudaGetDeviceProperties函数可以很方便的获取到设备的信息,函数原型是: cudaError_t CUDARTAPI cudaGetDevic ...

  5. 【原】对MYSQL下视图的一些总结

    注:本文使用mysql5.5版本为例.   做过数据库开发的同学,对视图(VIEW)应该不会陌生.   我接触视图最多的应用场景有两个: 1)出于权限问题,为了限制访问者看到过多的表字段(或内容),就 ...

  6. 基于Geoserver发布时间地图

    Geoserver它是著名的开源GIS其中软件. 地图服务软件也经常使用的物品.基于geoserver和Openlayers它可以建立一个自由的,开放源码GIS工程. Geoserver公布地图的步骤 ...

  7. 1.4微服务前奏 netcore学习

    1.要让vs2017能够选择.net core 2.1版本,只需要安装.net core2.1的sdk安装包就行了 官方地址:https://www.microsoft.com/net/learn/g ...

  8. 微信小程序 获取用户信息 encryptData解密 C#版本

    最近学习小程序开发,需要对encryptData解密,获取用户信息,官方源码没有C#版本,网上的资料比较杂,有的使用还有问题,下面贴一下自己亲试可以使用的一个源码 1.code 换取 session_ ...

  9. 学习vi和vim编辑(4):高速移动定位

    平时.第一步是编辑文本需要做将光标移动到需要编辑.因此,根据需要,将光标移动到目标数字键来编辑文本的速度在一定程度上. 一篇文章.主要介绍怎样高速移动光标. 依据屏幕来移动: 在一个有几千行文本的文件 ...

  10. NYOJ 298 相变点(矩阵高速功率)

    点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描写叙述 平面上有不超过10000个点.坐标都是已知的.如今可能对全部的点做下面几种操作: 平移一定距离(M),相对X ...