【发布时间】:2015-09-25 22:30:58
【问题描述】:
我有一个包含一个字段 ('fieldA') 的文档,该字段可以包含一个字符串或一个字符串数组。实际上,我更希望它只包含字符串,但弹性搜索映射不能那样工作。无论如何,现在我需要找到该字段为数组的每个文档。我该怎么做?
【问题讨论】:
标签: elasticsearch
我有一个包含一个字段 ('fieldA') 的文档,该字段可以包含一个字符串或一个字符串数组。实际上,我更希望它只包含字符串,但弹性搜索映射不能那样工作。无论如何,现在我需要找到该字段为数组的每个文档。我该怎么做?
【问题讨论】:
标签: elasticsearch
这个怎么样:
{
"query" : {
"filtered" : {
"filter" :{
"script" : {
"script" : "_source.fieldA.getClass() != String"
}
}
}
}
}
我必须打开特定的 Elasticsearch 设置才能在较新版本的 Elasticsearch 中使用该脚本。
script.engine.groovy.inline.search: on
这是我为创建示例索引而运行的脚本并尝试一下:
curl -w "\n" -XDELETE localhost:9200/scrap
curl -w "\n" -XPUT localhost:9200/scrap/ -d '
index :
number_of_replicas : 0
'
curl -w "\n" -XPUT localhost:9200/scrap/script-demo/1?refresh=1 -d '{
"fieldA" : "test string 1"
}'
curl -w "\n" -XPUT localhost:9200/scrap/script-demo/2?refresh=1 -d '{
"fieldA" : [
"test string 1",
"test string 2"
]
}'
curl -w "\n" -XPUT localhost:9200/scrap/script-demo/3?refresh=1 -d '{
"fieldA" : [
"test string 1"
]
}'
curl -w "\n" -XPOST localhost:9200/scrap/script-demo/_search -d '{
"query" : {
"filtered" : {
"filter" :{
"script" : {
"script" : "_source.fieldA.getClass() != String"
}
}
}
}
}' | python -m json.tool
# curl -w "\n" -XDELETE localhost:9200/scrap
当然,我正在对您可能在现场使用的分析仪做出假设,并且类似的细节可能会发挥作用。
这里有一些关于脚本的资源:
看起来脚本过滤器在 v2.0 中被替换了。
【讨论】: