当前位置: 首页 > 面试题库 >

负前瞻Regexp在ES DSL查询中不起作用

邢和光
2023-03-14
问题内容

我的elasticsearch的映射如下所示:

{
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "1"
    }
  },
  "mappings": {
    "node": {
      "properties": {
        "field1": {
          "type": "keyword"
        },
        "field2": {
          "type": "keyword"
        },
        "query": {
          "properties": {
            "regexp": {
              "properties": {
                "field1": {
                  "type": "keyword"
                },
                "field2": {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    }
  }
}

问题是:

我正在使用elasticsearch_dsl
Q()形成ES查询。当我的查询包含任何复杂的正则表达式时,它在大多数情况下都可以正常工作。但是,如果它包含正则表达式字符“!”,则它将完全失败。在里面。当搜索词包含“!”时,不会给出任何结果
在里面。

例如:

1.)Q('regexp', field1 = "^[a-z]{3}.b.*")(完美运作)

2.)Q('regexp', field1 = "^f04.*")(完美运作)

3.)Q('regexp', field1 = "f00.*")(完美运作)

4.)Q('regexp', field1 = "f04baz?")(完美运作)

在以下情况下失败:

5.)Q('regexp', field1 = "f04((?!z).)*")(完全没有结果的失败)

我尝试在字段中如上所述添加“ analyzer”:“关键字”以及“ type”:“关键字”,但是在这种情况下,没有任何效果。

在浏览器中,我尝试检查Analyzer:keyword如何在输入失败的情况下对输入起作用:

http:// localhost:9210 / search / _analyze?analyzer = keyword&text =
f04((?!z)。) *

看起来看起来不错,结果如下:

{
  "tokens": [
    {
      "token": "f04((?!z).)*",
      "start_offset": 0,
      "end_offset": 12,
      "type": "word",
      "position": 0
    }
  ]
}

我正在运行如下查询:

search_obj = Search(using = _conn, index = _index, doc_type = _type).query(Q('regexp', field1 = "f04baz?"))
count = search_obj.count()
response = search_obj[0:count].execute()
logger.debug("total nodes(hits):" + " " + str(response.hits.total))

请帮助,这确实是一个令人烦恼的问题,因为除!之外,所有正则表达式字符都可以在所有查询中正常工作。

另外,如何检查映射中当前使用上述设置的分析仪?


问题答案:

ElasticSearch
Lucene正则表达式引擎不支持任何类型的环视。在ES正则表达式的文件是比较模糊的说法
匹配一切都像.*很慢,以及使用环视正则表达式(这不仅暧昧,而且还错误的,因为lookarounds,明智地使用时,可以大大加快正则表达式匹配)。

由于您要匹配包含f04和不包含的任何字符串z,因此您实际上可以使用

[^z]*fo4[^z]*

细节

  • [^z]* -除0以外的任何其他字符 z
  • fo4- fo4子串
  • [^z]*-除以外的任何0+个字符z

如果您有一个多字符字符串要“排除”(例如,z4而不是z),则可以使用带有补码运算符的方法:

.*f04.*&~(.*z4.*)

这意味着几乎相同,但不支持换行符:

  • .* -尽可能使用除换行符以外的任何字符
  • f04 -- f04
  • .* -尽可能使用除换行符以外的任何字符
  • & -和
  • ~(.*z4.*) -除具有 z4


 类似资料:
  • 我试图为PostgreSQL SQL定义lexer规则。 这里是PostgreSQL运算符的原始定义:

  • 问题内容: 我正在使用嵌套集模型在iPhone上的本地SQLite数据库中存储较大的数据层次结构。我从他们的网站上阅读了MySQL技术文章,了解如何执行此操作,但是他们建议的查询(以及我需要的查询)之一似乎不适用于SQLite,并且我不确定如何解决它。 SQLite报告不是列,我认为这是因为其子查询实现不完整。有人对如何解决此限制有任何想法吗? 查询的目的是获取给定父节点的所有直接子代。 问题答案

  • 问题内容: 我有一个响应迅速的网页。它利用媒体查询。 但是在iframe中加载的同一页面无法正常工作。 例如,考虑到我的网页,当屏幕宽度小于640px时,我将背景色设置为红色。 因此,当我在新标签页中加载该窗口并使浏览器宽度小于640px时,背景颜色变为红色。 但是,在以320 * 480尺寸的iframe加载时,同一窗口没有红色的背景色。 如何使媒体查询在iframe中工作? 问题答案: 以这种

  • 问题内容: 我正在尝试从名为user_enrole的表中删除所有记录。 我认为查询的语法没有错,但这给了我错误提示 #1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册,以在第1行的’* FROM user_enrole’附近使用正确的语法 我已经仔细检查了我的语法,但我无法找出问题出在哪里,请有人指出。 是由于该表与使用表之间的关系而发生的还是什么? 问题答案: 您无需在删

  • 你能帮我解决这个问题吗?我想使用此方法在我的数据库中查找特定的缺口(它是由Apache Derby制作的)。我使用了EntityManager并从NetBeans中的数据库中映射持久性-实体类。 我得到这个错误: Java . lang . illegalargumentexception:在EntityManager中创建查询时出现异常:< br >异常描述:解析[SELECT * FROM U

  • 我试图捕捉两个最接近的短语之间的文本,包括这些短语,但消极的展望似乎在我的情况下不起作用。 因此,这是文本文件的一部分: 我需要捕捉每一对<代码> 我的正则表达式是: