首页 > 其他分享 >ElasticSearch笔记

ElasticSearch笔记

时间:2023-09-29 18:44:33浏览次数:80  
标签:00 文档 匹配 name 笔记 查询 ElasticSearch query

一、常用查询关键字

1、match

match是模糊匹配查询,根据分词器(如果创建mapping没有指定分词器,Es将会采取默认的分词器:standard,standard分词将会把匹配的词组分成单个的字,而不是短语)将指定的query查询的语句进行分词匹配。

# 查询索引中name为Tom的文档:
{
    'query': {
        'match': {
            'name': 'Tom'
        }
    }
}

2、match_pharse

match_pharse属于短语匹配,要求查询的词句和匹配的短语顺序必须一致,并且是连续的,但可以设置 slop 值来指定查询项之间可以分隔多远的距离

# 查询索引中woke为程序员的文档:
{
    'query': {
        'match_pharse': {
            'woke': '程序员'
        }
    }
}

3、fuzzy

fuzzy查询的时候,不会根据分词器匹配,只会进行拆分,比如查询的是"海zei王",在分词器下(也就是match中)是无法匹配到单个词的,因为它不是一个短语,但是在fuzzy中是可以匹配的,并且fuzzy支持模糊和一定的容错查询匹配,因为它做的是匹配词的拆分,并不是短语。

# 查询索引中name为海zei王的文档:
{
    'query': {
        'fuzzy': {
            'name': '海zei王'
        }
    }
}

4、multi_match

多字段匹配,比如在查询test这个值的时候我们不仅需要在A这个字段中查询,同时它也有可能存在B中,按照普通的写法你可能需要写两次查询,但是使用了multi_search只需要指定具体的fields就可以实现多字段查询

# 同时在age字段和phone字段搜索包含38这个数字的文档:
{
    'query': {
        'multi_match': {
            'query': '38',
            'fields':['age','phone']
        }
    }
}

5、regexp

正则表达式匹配,该匹配模式下我们可以按照正则表达式的符号去匹配具体的值,比如name字段,可以包含有.和去正则匹配具体的值,?表示任一字符,表示所有字符,还有其他的正则符号都可以使用,详情参考Regexp Query | Elasticsearch Guide [6.8] | Elastic

# 匹配手机号以1到9之前的开头,并且第二位是3最后一位是0或者1的手机号的文档:
{
    'query': {
        'regexp': {
            'phone': {
                'value':'[1-9]3.*[0-1]'
            }
        }
    }
}

6、wildcard

通配符匹配,wildcard和regexp类似,不过它们也有不同之处。regexp的实际匹配能力要大于wildcard,在进行简单的匹配时候,比如名字的*或者?的简单普通匹配,建议使用wildcard而不是regexp,wildcard的效率要高于regexp,regexp可以实现更为复杂的场景,但是效率低一些,通俗的说wildcard是regexp的简化版本.

# 采用通配符匹配手机的电话号
{
    'query': {
        'wildcard': {
            'phone': '13643091*'
        }
    }
}

7、term

term的英文含义表示是:精确的意思,在term查询中,表示做的是精确查询,整词匹配,不会对所匹配项进行拆分。直接以整词进行匹配,如果能查询到就命中该文档

# 查询的name为鲁班的文档
{
    'query': {
        'term': {
            'name': {
                'value':'鲁班'
            }
        }
    }
}

8、 terms

terms和term的区别就是terms允许匹配多个值,而term只允许匹配一个值,在进行多值匹配的场景中可以使用terms,terms匹配到其中任何一个值就会认为整个文档是匹配的,terms多个值如果多个都匹配会返回所有文档

# 查询age为24、66的任一值,查到就返回文档
{
    'query': {
        'terms': {
            'age': ['24','36']
        }
    }
}

9、range

range表示一个区间范围查找,这个范围可以是日期或者数值,ES的range比较灵活和明确,可以指定两个边界是否包含,通过参数include_lower:true 、include_upper:true来控制

# 查询age为20到30区间所有文档,
# include_lower表示是否包含边界最小值(true表示包含),
# include_upper表示是否包含边界最大值(true表示包含,false表示不包含)

{
    'query': {
        'range': {
            'age': {
                'from': 20,
                'to': 30,
                'include_lower':true,
                'include_upper':false
                }
        }
    }
}
# 查询log_time对应时间区间内的所有文档,
# gt/gt表示起始时间,gte包含起始时间点,gt不包含起始时间点,
# lt/lte表示结束时间,lte包结束时间点,lt不包含结束时间点

{
    'query': {
        'range': {
                'log_time': {
                    'gte': '2022-04-02 00:00:00',
                    'lt': '2022-04-02 23:00:00',
                    'format': 'yyyy-MM-dd HH:mm:ss',
                }
            }
    }
}

二、组合多查询

bool (布尔)过滤器。 这是个 复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。

1、must

文档 必须must 匹配这些条件才能被包含进来,与 AND 等价。

# must数组里面可以插入多个关键字查询条件
# 以下用例中查询sn为00000000, date_time为2022-04-02 00:00:00 到2022-04-02 23:00:00的文件
{
    'query': {
        'bool': {
                'must': [
                        {'terms': { 'sn': ['00000000']}},
                        {'range': {'date_time': {
                                'gt': '2022-04-02 00:00:00',
                                'lt': '2022-04-02 23:00:00',
                                'format': 'yyyy-MM-dd HH:mm:ss',
                            }}
                        }
                    ]
            }
    }
}

2、must_not

文档 必须不 must_not 匹配这些条件才能被包含进来,与 NOT 等价。

# 用例为:查询name不为李白的文件
{
    'query': {
        'bool': {
                'must_not': [
                        {'terms': { 'name': ['李白']}}
                    ]
            }
    }
}

3、should

至少有一个语句要匹配,与 OR 等价

# 用例为:查询name为李白或者age为12 的文件
{
    'query': {
        'bool': {
                'should': [
                        {'terms': { 'name': ['李白']}},
                        {'term': { 'age': '12'}}
                    ]
            }
    }
}

4、filter

必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。filter不会计算搜索条件相关度分数,也不会根据相关度分数进行排序,相对效率更高一些。

# 用例为:查询name为李白同的文件
{
    'query': {
        'bool': {
                'filter': [
                        {'terms': { 'name': ['李白']}}
                    ]
            }
    }
}

5、must、must_not、should组合用例

# 以下用例中查询
# sn为00000000, date_time为2022-04-02 00:00:00 到2022-04-02 23:00:00
# 或者name为Tom并且detail不以智能开头的文档
# name为To
{
    'query': {
        'bool': {
                'must': [
                        {'terms': { 'sn': ['00000000']}},
                        {'range': {'date_time': {
                                'gt': '2022-04-02 00:00:00',
                                'lt': '2022-04-02 23:00:00',
                                'format': 'yyyy-MM-dd HH:mm:ss',
                            }}
                        }
                    ],
                'must_not': [
                        {'regexp': {'detail':'智能*'}}
                    ],
                'should': [
                        {'match': { 'name': 'Tom'}}
                   ]
            }
    }
}

三、分页和排序

分页检索,可以通过size和from来实现,size返回的条数,默认是10条,from返回的开始。

排序,可以根据sort来实现,该字段可以指定索引字段,也可以指定返回结果中的其他字段。

{
    "query":{
        "match_all":{}
    },
    "from":1,
    "size":10,
     "sort": {
           "age":"desc",
           "money":"asc"
       }
}

标签:00,文档,匹配,name,笔记,查询,ElasticSearch,query
From: https://www.cnblogs.com/zhouqiangshuo/p/17737168.html

相关文章

  • 20211314王艺达学习笔记4
    学习总结第七章文件操作文件操作级别(1)硬件级别fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件(2)操作系统内核中的文件系统函数前缀为k表示内核函数(3)系统调用open()、read()、lseek()、close()open()、......
  • 从小工到专家阅读笔记(一)
    第一篇:1.我的源码让猫给吃了 出现了未曾想的问题,要设法尽可能地处理它们,可以为自己的能力自豪,但对于错误必须真诚面对。对于不可能做到的事情,有权不为之负责,如果答应别人的项目必须切实负则。不要为出错的情况找借口,对老板说"我的源码让猫给吃了”这种言语,对解决问题没有任何......
  • 数位dp学习笔记
    数位dp学习笔记目录数位dp学习笔记数位dp定义:题型特征:dp设计:dp转移例题:BZOJ3679数位dp定义:...好像就是对数位进行dp,统计方案数。题型特征:通常会有10组左右的询问,每一次询问你较大(1e18左右)的区间内满足某个条件的数的数量。dp设计:dp一般会有2到4维。通常情况下,第一维i表......
  • 《程序员修炼之道:从小工到专家》第一第二章读书笔记
    第一章:追求实效的哲学第一节:我的源码被猫吃了在开发过程中,我们经常会遇到一些意想不到的技术问题,导致交付延迟等情况。然而,作为程序员,我们需要诚实和坦率地面对这些问题,并勇于承认自己的错误。我们应该以专业的态度处理这些问题,而不是找借口。此外,我们要对自己承担的责任负责。......
  • 国庆NOIP储备营讲课笔记
    Day1(基础算法)讲师:余快枚举法例题1给定一个数\(x\),判断\(x\)是不是质数。朴素算法:枚举\([2,x−1]\)之间所有的整数\(i\),逐个判断\(x\)是否被\(i\)整除,若都不能整除则\(x\)是质数,时间复杂度\(O(x)\),搞个\(10^9\)直接卡过。该怎么优化呢?优化枚举范围:只需枚举到......
  • 学习笔记
    周屹梁的学习笔记个人各平台地址博客地址:https://www.cnblogs.com/zylyehuo/gitee地址:https://gitee.com/zylyehuogithub地址:https://github.com/zylyehuo夯实基础四元数法|代价地图组成(多层叠加)|通过openpyxl操作excel表格|Ubuntu下查看ip|Windows终......
  • [笔记]操作系统_2024年考纲
    一、操作系统基础(一)操作系统的基本概念(二)操作系统发展历程(三)程序运行环境1.CPU运行模式内核模式,用户模式。2.中断和异常的处理3.系统调用4.程序的链接与装入5.程序运行时的内存映像与地址空间(四)操作系统结构分层,模块化,宏内核,微内核,外核。(五)操作系统引导(六)虚拟......
  • 9.29 《代码大全2》阅读笔记
    《代码大全2》是一本非常经典的软件开发书籍。在书中,强调了比较优秀的代码结构和命名规范的重要性。书中注释的部分帮助我理解怎么去编写有意义的注释,合适的注释可以提供代码理解上的便利,但是过多或者无关的注释会干扰代码的可读性。还有书中关于代码复用和模块化的内容帮助学习......
  • 初中生都能看懂的 LCT 学习笔记
    初中生都能看懂的LCT学习笔记这篇文章偏向入门,旨在尽可能解决一类问题——动态树,主要讲述并且整理LCT算法及其一些变式。目前其变式例题作者还在整理之中,编者保证会把变式例题持续更新。0.前置知识splay。我可以猜测一下,你们可能看到splay,然后就可能去学了splay树,然......
  • Python笔记:基本数据结构(容器)的优化
    列表的性能问题队列的弹出问题利用Python的原生语法很难写出一个真正完全能达到\(O(1)\)的队列,究其原因是由于insert方法的时间复杂度问题:classqueue: def__init__(self,q): self.q=[] defpopright(self): self.q.pop() defappendleft(self,elem): self.q.ins......