从以下示例弹性搜索数据我想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"
]
}
}
]
答案 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”搜索将返回该字符串的所有结果。