ElasticSearch regexp以点字符表示失败

时间:2015-07-20 09:13:58

标签: regex elasticsearch

这是我的设置和映射:

{
  'settings': {
    'index':{
       'analysis':{
          'analyzer':{
             'analyzer_keyword':{
                'tokenizer': 'keyword',
                'filter': 'lowercase'
             }
          }
       }
    }
  },
  'mappings': {
    'example':{
        'properties': {
          'group'            : {'type' : 'string', 'analyzer': 'analyzer_keyword'},
          'description'       : {'type' : 'string', 'analyzer': 'analyzer_keyword'},
          'names'          : {'type' : 'string', 'analyzer': 'analyzer_keyword'}
        }
    }
  }
}

由于我的上下文(我需要搜索部分模式),我需要使用bool(must,must_not,should)查询与正则表达式相结合。除了包含点字符的字段外,它适用于我的所有字段。

例如, names是一个字符串数组,其中包含带点的数据: "cyap7_1.pe3269","synp6_1.pe2492","syns3_1.pe382","cyap8_1.pe2829"

以下是一些可行的示例(按预期返回结果)和不起作用的示例(不返回任何结果):

简单查询有效:

curl -XPOST "http://localhost:9200/example/test/_search?q=cyap7_1.pe3269"

部分匹配的简单查询不起作用:

curl -XPOST "http://localhost:9200/example/test/_search?q=*cyap7_1.pe3269*"

我想要的确切查询不起作用:***

curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*cyap7_1.pe3269.*"}}}} } } }'

此查询的子部分有效:

curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*pe3269.*"}}}} } } }'


curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*cyap7_1.*"}}}} } } }'

使用dot的此查询的子部分不起作用(即使使用正则表达式改进):

curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*1.pe3.*"}}}} } } }'


curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*cyap7_1\.pe3269.*"}}}} } } }'


curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*cyap7_1\\.pe3269.*"}}}} } } }'


curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*cyap7_1.*pe3269.*"}}}} } } }'

***如何使此查询有效?

更新

这真的很奇怪,但现在适用于:

curl -XPOST "http://localhost:9200/example/test/_search" -d 
  '{ 'query': { 'filtered': { 'filter': 
  {"bool":{"must":{"regexp":{"names":".*cyap7_1.pe3269.*"}}}} } } }'

当我更新索引以添加字段names时,我已经创建了索引。 因此,在更新.*cyap7_1.*.*pe3269.*之后工作但不是.*cyap7_1.pe3269.*这真的很奇怪,这就是我创建帖子的原因。

但是现在,我删除了索引然后重新创建它。它适用于.*cyap7_1.pe3269.* ... 更新类型失败了整个术语的索引......

0 个答案:

没有答案