elasticsearch通配符和正则表达式查询
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch通配符和正则表达式查询相关的知识,希望对你有一定的参考价值。
参考技术A 通配符(wildcard)和正则表达式查询(regexp),相关的还有prefix前缀查询(前缀查询我们这里用不到,不做过多说明),他们都是底层基于词的查询,注意事基于词的,其工作方式就是扫描倒排索引中的词列表才能找到所有匹配的词,然后依次获得每个词的文档ID,这三种查询都需要考虑性能问题,为了节省资源,要避免使用左通配这样的模式匹配(如: foo 或 . foo 这样的正则式)。
prefix 、 wildcard 和 regexp 查询是基于词操作的,如果用它们来查询 analyzed 字段,它们会检查字段里面的每个词,而不是将字段作为整体来处理。
比方说包含 “Quick brown fox” (快速的棕色狐狸)的 title 字段会生成词: quick、brown和fox:
"regexp": "title": "br.*" //会匹配到
"regexp": "title": "Qu.*" //不会匹配到,因为索引里是quick而不是Quick
"regexp": "title": "quick br*" //不会匹配到,因为quick和brown在词表(倒排索引)中是分开的
基于以上分析,因为我们项目的字段处理都是分词的,所以需要查询字段对应的keyword字段,这一点很重要,之前没有这么做,是导致正则查询不准确的原因之一。
在elasticsearch中搜索多个字段作为正则表达式查询
【中文标题】在elasticsearch中搜索多个字段作为正则表达式查询【英文标题】:search multiple field as regexp query in elasticsearch 【发布时间】:2022-01-23 00:16:29 【问题描述】:我正在尝试按标题和描述等不同字段进行搜索。当我输入关键字时,如果描述或标题包含我输入的关键字,elasticseach 必须找到一些东西。这是我的目标。我怎样才能达到我的目标?
您可以看到我用于一个字段的示例代码。
query:
regexp:
title: `.*$q.*`,
,
,
我也试过下面的一个,但它给出了语法错误。
query:
regexp:
title: `.*$q.*`,
,
regexp:
description: `.*$q.*`,
,
,
【问题讨论】:
【参考方案1】:为此,您需要使用bool
查询。
GET /<you index>/_search
"query":
"bool":
"should": [
"regexp":
"title": ".*$q.*"
,
"regexp":
"description": ".*$q.*"
]
您可以找到文档 => [doc]
【讨论】:
以上是关于elasticsearch通配符和正则表达式查询的主要内容,如果未能解决你的问题,请参考以下文章