[Elasticsearch] 部分匹配 (二) - 通配符及正则表达式查询

通配符和正则表达式查询

wildcard查询和prefix查询类似,也是一个基于词条的低级别查询。但是它能够让你指定一个模式(Pattern),而不是一个前缀(Prefix)。它使用标准的shell通配符:?用来匹配任意字符,*用来匹配零个或者多个字符。

以下查询能够匹配包含W1F 7HW和W2F 8HW的文档:

GET /my_index/address/_search
{
    "query": {
        "wildcard": {
            "postcode": "W?F*HW"
        }
    }
}

假设现在你想匹配在W地域(Area)的所有邮政编码。使用前缀匹配时,以WC开头的邮政编码也会被匹配,在使用通配符查询时也会遇到类似的问题。我们只想匹配以W开头,紧跟着数字的邮政编码。使用regexp查询能够让你写下更复杂的模式:

GET /my_index/address/_search
{
    "query": {
        "regexp": {
            "postcode": "W[0-9].+"
        }
    }
}

这个正则表达式的规定了词条需要以W开头,紧跟着一个0到9的数字,然后是一个或者多个其它字符。

wildcard和regexp查询的工作方式和prefix查询完全一样。它们也需要遍历倒排索引中的词条列表来找到所有的匹配词条,然后逐个词条地收集对应的文档ID。它们和prefix查询的唯一区别在于它们能够支持更加复杂的模式。

这也意味着使用它们存在相同的风险。对一个含有很多不同词条的字段运行这类查询是非常消耗资源的。避免使用一个以通配符开头的模式(比如,*foo或者正则表达式: .*foo)。

尽管对于前缀匹配,可以在索引期间准备你的数据让它更加高效,通配符和正则表达式匹配只能在查询期间被完成。虽然使用场景有限,但是这些查询也有它们的用武之地。

注意

prefix,wildcard以及regexp查询基于词条进行操作。如果你在一个analyzed字段上使用了它们,它们会检查字段中的每个词条,而不是整个字段。

比如,假设我们的title字段中含有"Quick brown fox",它会产生词条quick,brown和fox。

这个查询能够匹配:

{ "regexp": { "title": "br.*" }}

而不会匹配:

{ "regexp": { "title": "Qu.*" }}
{ "regexp": { "title": "quick br*" }}
时间: 2024-12-29 05:56:05

[Elasticsearch] 部分匹配 (二) - 通配符及正则表达式查询的相关文章

[Elasticsearch] 邻近匹配 (二) - 多值字段,邻近程度与相关度

多值字段(Multivalue Fields) 在多值字段上使用短语匹配会产生古怪的行为: PUT /my_index/groups/1 { "names": [ "John Abraham", "Lincoln Smith"] } 运行一个针对Abraham Lincoln的短语查询: GET /my_index/groups/_search { "query": { "match_phrase": {

[Elasticsearch] 部分匹配 (一) - 前缀查询

部分匹配(Partial Matching) 敏锐的读者可能已经发现到目前为止,介绍的查询都是在整个词条层面进行操作的.匹配的最小单元必须是一个词条.你只能找到存在于倒排索引(Inverted Index)中的词条. 但是如果你想匹配词条的一部分,而不是整个词条呢?部分匹配(Partial Matching)允许用户指定词条的一部分然后找到含有该部分的任何单词. 匹配词条一部分这一需求在全文搜索引擎领域比你想象的要不那么常见.如果你有SQL的背景,你可能有过使用下面的SQL语句来实现一个简单的全

【我的Linux,我做主!】通配符和正则表达式深层解析

目录:(一)了解通配符和正则的作用(二)通配符的使用(三)正则表达式的使用(四)扩展正则表达式的使用 (一)了解通配符和正则的作用(1.1)在我们日常的工作中,我们都会使用到通配符或者正则表达式.通配符是一种特殊语句,主要有星号(*)和问号(?),用来模糊搜索文件.当查找文件夹时,可以使用它来代替一个或多个真正字符:当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符.正则表达式是计算机科学的一个概念,正则表达式通常被用来检索.替换那些符合某个模式的文本,正则表达式是对

SQL Server之 (二) SQL语句 模糊查询 空值处理 聚合函数

(二) SQL语句  模糊查询  空值处理  聚合函数 自己学习笔记,转载请注明出处,谢谢!---酸菜 SQL :结构化查询语言(Structured Query Language),关系数据库管理系统的标准语言. Sybase与Mircosoft对标准SQL做了扩展:T-SQL (Transact-SQL); 注:①SQL对大小写的敏感取决于排序规则,一般不敏感; ②SQL对单引号的转义,用两个单引号来表示一个单引号; ③SQL执行顺序: 1→2→3→4 select  * ---------

通配符和正则表达式

在看鸟哥的Linux私房菜的时候看到十二章一直强调通配符和正则表达式的区别,在我的理解中,两者貌似是一样的都是用来匹配的.Google之网上给出的答案是: 在文本过滤工具里,都是用正则表达式,比如像awk,sed,等,是针对文件的内容的 而通配符多用在文件名上,比如查找find,ls,cp,等等 下表是鸟哥给的Linux下的通配符 符號 內容 * 萬用字元,代表 0 個或多個字元(或數字) ? 萬用字元,代表『一定有』一個字母 # 註解,這個最常被使用在 script 當中,視為說明! / 跳脫

mysql中使用正则表达式查询

正则表达式功能确实很强大,那天专门抽空学学,这里就暂时在mysql查询中用用. 正则表达式强大而灵活,可以应用于非常复杂的查询. 选项 说明(自动加匹配二字) 例子 匹配值示例 ^ 文本开始字符 '^b'匹配以字母b开头的字符串 book, big, banana, bike $ 文本结束字符 'st$'匹配以st结尾的字符串 test, resist, persist . 任何单个字符 'b.t'匹配任何b和t之间有一个字符 bit, bat, but, bite * 0个或多个在它前面的字符

MySQL必知必会读书笔记-2(去重,limit,结果的排序,通配符,正则表达式)

DISTINCT(去重)和LIMIT 检索不重复的数据 使用DISTINCT关键字,注意,这个关键字是针对所有列的 #查找所有不同的vend_idSELECT DISTINCT vend_id FROM products #查找所有不同的vend_id, prod_price SELECT DISTINCT vend_id, prod_price FROM products 结果行数的限制 使用LIMIT SELECT prod_name FROM products LIMIT 3, 4;#输出

linux通配符与正则表达式

通配符 *  任意字符,可重复多次 ? 任意字符,重复一次 [] 代表一个字符 举例: [a,b,c] 表示abc中任意一个 通配符的作用是用来匹配文件名的 正则表达式 正则表达式是在文件中匹配符合条件的字符串的 ls find cp是不支持正则表达式的 但是grep awk sed支持正则表达式 [[email protected] test]# touch aa [[email protected] test]# touch aab aabb [[email protected] test]

Linux07--Shell程序设计03 通配符与正则表达式

通配符 通配符可用于代替字符. 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符. 使用情况: 1.文件和目录 在CP/M.DOS.Microsoft Windows和类Unix操作系统中描述文件名(或路径)时,星号(*)匹配零个或多个任意字符.问号(?)匹配零个或不多于问号个数的任意字符.如:123??? 将匹配 1231 或 12313,但不会匹配 123991991.在Unix shell和Windows PowerShell中,方括号("["和"]&qu