Elasticsearch 索引搜索模板在数组中生成空字符串
Elasticsearch indexed search template generates empty strings in array
首先,这是摘自documentation:
Passing an array of strings
GET /_search/template
{
"template": {
"query": {
"terms": {
"status": [
"{{#status}}",
"{{.}}",
"{{/status}}"
]
}
}
},
"params": {
"status": [ "pending", "published" ]
}
}
which is rendered as:
{
"query": {
"terms": {
"status": [ "pending", "published" ]
}
}
然而,在我的场景中,我做了完全相同的模板(至少我是这么认为的),但它为我产生了稍微不同的输出:
.."filter" : {
"bool" : {
"must" : [{
"terms" : {
"myTerms" : [
"{{#myTerms}}",
"{{.}}",
"{{/myTerms}}"
],
"_cache" : true
}
}
]
}
}..
我以后就是这样称呼它的:
GET /passport/_search/template
{
"template": {
"id": "myTemplate"
},
"params": {
"myTerms": ["1", "2"]
}
}
然而它呈现为:
.."myTerms" : ["", "1", "2", ""]..
这不是问题,但 myTerms 存储为整数,我想保持这种方式(但如果这只是解决方案,那么很好,我可以接受),然后查询抛出无法将“”转换为整数类型的异常,这是预期的行为
NumberFormatException[For input string: \"\"]
我该如何处理?我不想将我的模板存储为文件,我更喜欢将它们编入索引。
这个 SO 问题很有前途:Pass an array of integers to ElasticSeach template 但不清楚,答案也没有解决我的问题(不允许我那样存储我的模板)。
使用的 Elasticsearch 版本:1.6.0
请指教
我以前见过这个要求,这个解决方案看起来很老套,但它确实有效。基本上,模板中的逗号是问题所在,因为 Mustache 将遍历数组,并且数组中的每个元素都会放置元素 - {{.}}
- 但也会放置 comma在 {{#myTerms}}
和 {{/myTerms}}
.
内指定
而且,在你的情况下 你不应该使用双引号 - "{{.}}"
因为元素本身将被双引号包围。这就是您在结果中看到 "1"
的原因。但是,如果你想匹配应该是数字列表的数字,而不是字符串。
所以,首先,去掉双引号。这意味着,用双引号将模板括起来,并转义任何应该出现在最终结果中的双引号(您很快就会通过下面的示例理解)。
其次,hacky 部分是模拟结果中的逗号 并跳过最后一个逗号。意思是,1,2,3,
不应包含最后一个逗号。解决方案是将参数作为元组列表提供 - 元组的一个元素是值本身,另一个元素是布尔值:[{"value":1,"comma":true},{"value":2,"comma":true},{"value":4}]
。如果 comma
是 true
,那么 Mustache 应该放置 ,
,否则不放置(这种情况是针对数组中的最后一个元素)。
POST /_search/template/myTemplate
{"template":"{\"filter\":{\"bool\":{\"must\":[{\"terms\":{\"myTerms\":[{{#myTerms}}{{value}}{{#comma}},{{/comma}}{{/myTerms}}],\"_cache\":true}}]}}}"}
这就是您应该如何传递参数:
{
"template": {
"id": "myTemplate"
},
"params": {
"myTerms": [{"value":1,"comma":true},{"value":2,"comma":true},{"value":4}]
}
}
这样做是为了生成这样的东西:
{
"filter": {
"bool": {
"must": [
{
"terms": {
"myTerms": [1,2,4],
"_cache": true
}
}
]
}
}
}
首先,这是摘自documentation:
Passing an array of strings
GET /_search/template { "template": { "query": { "terms": { "status": [ "{{#status}}", "{{.}}", "{{/status}}" ] } } }, "params": { "status": [ "pending", "published" ] } }
which is rendered as:
{ "query": { "terms": { "status": [ "pending", "published" ] } }
然而,在我的场景中,我做了完全相同的模板(至少我是这么认为的),但它为我产生了稍微不同的输出:
.."filter" : {
"bool" : {
"must" : [{
"terms" : {
"myTerms" : [
"{{#myTerms}}",
"{{.}}",
"{{/myTerms}}"
],
"_cache" : true
}
}
]
}
}..
我以后就是这样称呼它的:
GET /passport/_search/template
{
"template": {
"id": "myTemplate"
},
"params": {
"myTerms": ["1", "2"]
}
}
然而它呈现为:
.."myTerms" : ["", "1", "2", ""]..
这不是问题,但 myTerms 存储为整数,我想保持这种方式(但如果这只是解决方案,那么很好,我可以接受),然后查询抛出无法将“”转换为整数类型的异常,这是预期的行为
NumberFormatException[For input string: \"\"]
我该如何处理?我不想将我的模板存储为文件,我更喜欢将它们编入索引。
这个 SO 问题很有前途:Pass an array of integers to ElasticSeach template 但不清楚,答案也没有解决我的问题(不允许我那样存储我的模板)。
使用的 Elasticsearch 版本:1.6.0
请指教
我以前见过这个要求,这个解决方案看起来很老套,但它确实有效。基本上,模板中的逗号是问题所在,因为 Mustache 将遍历数组,并且数组中的每个元素都会放置元素 - {{.}}
- 但也会放置 comma在 {{#myTerms}}
和 {{/myTerms}}
.
而且,在你的情况下 你不应该使用双引号 - "{{.}}"
因为元素本身将被双引号包围。这就是您在结果中看到 "1"
的原因。但是,如果你想匹配应该是数字列表的数字,而不是字符串。
所以,首先,去掉双引号。这意味着,用双引号将模板括起来,并转义任何应该出现在最终结果中的双引号(您很快就会通过下面的示例理解)。
其次,hacky 部分是模拟结果中的逗号 并跳过最后一个逗号。意思是,1,2,3,
不应包含最后一个逗号。解决方案是将参数作为元组列表提供 - 元组的一个元素是值本身,另一个元素是布尔值:[{"value":1,"comma":true},{"value":2,"comma":true},{"value":4}]
。如果 comma
是 true
,那么 Mustache 应该放置 ,
,否则不放置(这种情况是针对数组中的最后一个元素)。
POST /_search/template/myTemplate
{"template":"{\"filter\":{\"bool\":{\"must\":[{\"terms\":{\"myTerms\":[{{#myTerms}}{{value}}{{#comma}},{{/comma}}{{/myTerms}}],\"_cache\":true}}]}}}"}
这就是您应该如何传递参数:
{
"template": {
"id": "myTemplate"
},
"params": {
"myTerms": [{"value":1,"comma":true},{"value":2,"comma":true},{"value":4}]
}
}
这样做是为了生成这样的东西:
{
"filter": {
"bool": {
"must": [
{
"terms": {
"myTerms": [1,2,4],
"_cache": true
}
}
]
}
}
}