Elasticsearch查询参数介绍

因为项目需要调用api查询elasticsearch拿数据,这边记录一下项目中常用的一些查询参数

es的查询接口为:

GET /索引名/_search
python调用

data为需要传入的参数

import requests

res = requests.request("POST", f"http://127.0.0.1:9200/{index}/_search", json=data)

print(res.json())

一、常用查询关键字

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"
       }
}

ElasticSearch的API使用 - Yrion - 博客园

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:Elasticsearch是基于Lucene技术的搜索引擎,可以对数据进行缓存并进行查询。与数据库查询相比,Elasticsearch支持分词模糊查询,可以将查询条件进行拆分查询,得到更灵活范围更广的结果。\[1\]引用\[2\]:基于全文的查询与基于词项的查询最显著的区别是前者会对查询条件做分析,使用的分析器可以在索引创建时通过analyzer参数或search_analyzer参数设置,也可以在检索时通过_search接口的analyzer参数动态修改。\[2\]引用\[3\]:Elasticsearch检索接口_search可通过URI参数q或请求体参数query接收DSL描述的查询条件,其中参数q接收DSL中定义的查询字符串,而query参数则可以接收所有DSL查询条件。叶子查询是在指定的字段中匹配查询条件,可以分为基于词项的查询和基于全文的查询两大类。\[3\] 根据引用的内容,elasticsearch模糊查询参数详解如下: 1. 分词模糊查询Elasticsearch支持分词模糊查询,可以通过设置分析器(analyzer)参数或搜索分析器(search_analyzer)参数来定义分词器。分词器可以在索引创建时设置,也可以在检索时动态修改。 2. 查询字符串:可以通过URI参数q或请求体参数query来传递查询字符串。查询字符串可以包含DSL描述的查询条件,用于指定要匹配的字段和查询条件。 3. 基于词项的查询:基于词项的查询是叶子查询的一种类型,可以针对指定的字段进行匹配查询。可以使用multi_match和query_string查询来针对多个字段进行查询。 4. 模糊查询:模糊查询是叶子查询的一种类型,可以用于匹配指定字段中的模糊查询条件。模糊查询可以通过设置查询条件来实现相关性计算等全文检索专业问题。 综上所述,elasticsearch模糊查询参数详解包括分词模糊查询查询字符串、基于词项的查询和模糊查询等。 #### 引用[.reference_title] - *1* [SpringBoot+Mybatis+Elasticsearch 实现模糊分页查询并标记关键字](https://blog.csdn.net/qq_29751581/article/details/127089956)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Elasticsearch叶子查询与模糊查询(五)](https://blog.csdn.net/tianzhonghaoqing/article/details/124552811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值