首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一日一技:在ES中如何使用通配符搜索keyword字段

一日一技:在ES中如何使用通配符搜索keyword字段

作者头像
青南
发布2019-11-30 21:28:20
发布2019-11-30 21:28:20
8.4K0
举报
文章被收录于专栏:未闻Code未闻Code

游玩:kingname & 产品经理

我们知道,在 ES 中,字段类型如果是keyword,那么在搜索的时候一般只能整体搜索,不支持搜索部分内容。例如,有一个字段叫做{"name": "我是青南"},当我使用{"match": {"name": "我是青南"}}的时候可以正常搜索出来。但是当我使用{"match": {"name": "青南"}}时,就什么都搜索不到。

但是,ES 支持使用通配符来进行搜索,于是我们可以把 DSL 搜索语句构造为:

代码语言:javascript
复制
{"wildcard": {"name": "*青南*"}}

这样就能正常搜索出结果了。

下面给出一段可以正常使用的elasticsearch-py的代码,用于编写 DSL 语句在 Elasticsearch 中搜索数据:

代码语言:javascript
复制
from elasticsearch import Elasticsearch, helpers
es = Elasticsearch([{'host': 'xx.xx.xx.xx', 'port': 1234}], timeout=30)

body = {
        "query": {
            "bool": {
                "filter": [
                    {
                      "range": {
                          "ts": {
                              "gte": '2019-11-01 00:00:00',
                              "lt": '2019-11-29 00:00:00'
                          }
                      },
                    }
                ],
                'must': [
                    {'match_phrase': {'source': 'baidu'}},
                    {'wildcard': {'title': '*青南*'}}
                ],
                "must_not": [
                     {'wildcard': {'title': {'value': '*大神*'}}}
                ],
            }
        },
        }
res = es.search(index='spider_data', body=body)
print(res)

这段代码的意思是说:

搜索 ts 时间范围在2019-11-01 00:00:002019-11-29 00:00:00,并且source字段为baidutitle字段包含青南但是不包含大神的数据。

但需要注意的是,使用通配符搜索,会对 ES 集群造成比较大的压力,特别是*号在前时,会有一定的性能损耗。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档