弹性搜索查询字符串正则表达式

时间:2015-12-16 12:34:08

标签: elasticsearch

我在使用查询字符串regex查询字段(标题)时遇到问题。

这有效:"标题:/ test /"
这不是:"标题:/ ^测试$ /"

但他们提到支持https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax

我的目标是完全匹配,但这个匹配不应该是偏的,它应该与整个字段值匹配。

有人知道这里可能有什么问题吗?

2 个答案:

答案 0 :(得分:3)

来自documentation

  

Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符。

您正在使用不受支持的锚点^$,因为不再需要它,再次来自文档

  

Lucene的模式总是固定不变的。提供的模式必须与整个字符串匹配

如果您正在寻找phrase query种匹配,可以使用double quotes这样的

{
  "query": {
    "query_string": {
      "default_field": "title",
      "query": "\"test phrase\""

    }
  }
}

但这也会匹配带有测试短语someword

等标题的文档

如果您想要完全匹配,则应该查找term queries,将标题字段映射为"index" : "not_analyzed",或者将keyword analyzerlowercase filter一起使用用于不区分大小写的匹配。您的查询将如下所示

{
  "query": {
    "term": {
      "title": {
        "value": "my title"
      }
    }
  }
}

这将为您提供完全匹配

答案 1 :(得分:3)

通常在Regex中,^和$符号用于表示文本应位于字符串的开头/结尾。这称为锚定。 Lucene正则表达式模式默认为锚定。

所以模式"测试"与Elasticsearch相当于" ^ test $"用Java说。

你必须努力工作" unanchor"你的模式,例如使用" te。*"匹配"测试","测试"和#34;牙齿"。因为模式"测试"只会匹配"测试"。

请注意,这需要对字段进行分析,并注意它的性能非常糟糕。对于完全匹配,请使用ChintanShah25答案中描述的术语过滤器。