如何在elasticsearch中的_id上进行通配符或正则表达式匹配?

时间:2015-06-15 11:34:10

标签: elasticsearch

从以下示例弹性搜索数据我想wildcard*.000ANT.*上说_id,以便获取_id包含000ANT的所有文档。请帮忙。

"hits": [
  {
    "_index": "data_collector",
    "_type": "agents",
    "_id": "Org000LAN_example1.com",
    "_score": 1,
    "fields": {
      "host": [
        "example1.com"
      ]
    }
  },
  {
    "_index": "data_collector",
    "_type": "agents",
    "_id": "000BAN_example2.com",
    "_score": 1,
    "fields": {
      "host": [
        "example2.com"
      ]
    }
  },
  {
    "_index": "data_collector",
    "_type": "agents",
    "_id": "000ANT_example3.com",
    "_score": 1,
    "fields": {
      "host": [
        "example3.com"
      ]
    }
  }
]

5 个答案:

答案 0 :(得分:6)

这只是Andrei Stefan的answer

的扩展
{
  "query": {
    "script": {
      "script": "doc['_id'][0].indexOf('000ANT') > -1"
    }
  }
}

注意:我不知道这种查询对性能的影响,这很可能不是一个好主意。谨慎使用,如果可能,避免使用。

答案 1 :(得分:4)

试试这个

{{1}}

答案 2 :(得分:3)

您可以使用这样的wildcard query,但值得注意的是,不建议您使用*启动通配符,因为性能会受到影响。

{
  "query": {
    "wildcard": {
      "_uid": "*000ANT*"
    }
  }
}

另请注意,如果您要搜索的通配符与文档的类型名称匹配,则使用uid将不起作用,因为uid只是类型的缩写和id:{{ 1}}

答案 3 :(得分:2)

允许您对id的映射进行索引:

{
  "mappings": {
    "agents": {
        "_id": {
        "index": "not_analyzed"
      }
    }
  }
}

使用query_string搜索它:

{
  "query": {
    "query_string": {
      "query": "_id:(*000ANT*)",
      "lowercase_expanded_terms": false
    }
  }
}

或者像这样(使用脚本并且仍然只查询_id):

{
  "query": {
    "filtered": {
      "filter": {
        "script": {
          "script": "org.elasticsearch.index.mapper.Uid.splitUidIntoTypeAndId(new org.apache.lucene.util.BytesRef(doc['_uid'].value))[1].utf8ToString().contains('000ANT')"
        }
      }
    }
  }
}

答案 4 :(得分:1)

这里有两个选项,第一个是使用部分匹配,最简单的方法是使用与其他答案类似的通配符包装查询。这适用于not_analyzed字段,区分大小写。

POST /my_index/my_type/_search
{
"query": {
    "wildcard": {
       "_id": {
          "value": "*000ANT*"
       }
    }
}
}

第二个选项是使用ElasticSearch分析器和正确的映射来描述您正在寻找的功能,您可以阅读有关here的内容。

基本前提是你在映射中引入了一个分析器,它有一个标记器,它可以将字符串分解成更小的标记然后可以匹配。在标记化的_id字段上执行简单查询“000ANT”搜索将返回该字符串的所有结果。