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通配符和正则表达式查询的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式模块

Linux之正则表达式

Mysql——通配符和正则表达式的使用

Linux正则表达式与通配符

Elasticsearch中URI Search和RequestBody Search分析

Elasticsearch中URI Search和RequestBody Search分析