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

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 一日一技:在ES中如何使用通配符搜索keyword字段

摄影:产品经理游玩:kingname & 产品经理

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

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

{"wildcard": {"name": "*青南*"}}

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

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

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 集群造成比较大的压力,特别是*号在前时,会有一定的性能损耗。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
7月前
|
JSON 自然语言处理 Java
es索引、类型(mapping)、文档、ik分词器
es索引、类型(mapping)、文档、ik分词器
158 1
|
存储 自然语言处理 Java
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
【elasticsearch】记录ES查询数据结果为空的问题(单个字搜索可以,词语搜索为空)
717 0
|
自然语言处理 索引
ES 匹配多个搜索条件和精确查询
ES 匹配多个搜索条件和精确查询
|
数据采集 开发者
|
自然语言处理 索引
ES中如何对text字段进行精确匹配
ES中如何对text字段进行精确匹配
1077 0
|
SQL 索引
白话Elasticsearch03- 结构化搜索之基于bool组合多个filter条件来搜索数据
白话Elasticsearch03- 结构化搜索之基于bool组合多个filter条件来搜索数据
305 0
|
SQL Java
白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
白话Elasticsearch04- 结构化搜索之使用terms query搜索多个值以及多值搜索结果优化
531 0
|
SQL
白话Elasticsearch05- 结构化搜索之使用range query来进行范围过滤
白话Elasticsearch05- 结构化搜索之使用range query来进行范围过滤
126 0
odoo 为可编辑列表视图字段搜索添加查询过滤条件
odoo 为可编辑列表视图字段搜索添加查询过滤条件
211 0
|
自然语言处理 Java
如何使用ES更有效率的进行多字段模糊匹配
如何使用ES更有效率的进行多字段模糊匹配