【问题标题】:String Comparison with Elasticsearch Groovy Dynamic Script与 Elasticsearch Groovy 动态脚本的字符串比较
【发布时间】:2015-08-18 02:51:38
【问题描述】:

我有一个包含各种成员文档的弹性搜索索引。每个成员文档都包含一个成员资格对象,以及与/描述个人成员资格相关的各种字段。例如:

{membership:{'join_date':2015-01-01,'status':'A'}}

会员状态可以是“A”(活跃)或“I”(不活跃);两个 Unicode 字符串值。我有兴趣稍微提高包含有效成员身份的文档的分数。

在我的 groovy 脚本中,以及各种数字字段上的其他自定义助推器,我添加了以下内容:

String status = doc['membership.status'].value; 
float status_boost = 0.0;

if (status=='A') {status_boost = 2.0} else {status_boost=0.0}; 

return _score + status_boost

由于某些与字符串如何通过 groovy 操作相关的原因,检查 (status=='A') 不起作用。我尝试了(status.toString()=='A')(status.toString()=="A")(status.equals('A')),以及许多其他变体。

我应该如何解决这个问题(以高效的方式)?我没有 groovy 的独立安装,但是当我在 python 中提取响应数据时,状态非常好,所以要么是 Unicode 'A' 要么 'I' 没有额外的间距或字符。

【问题讨论】:

  • Are you sure the value is 'A' ,因为经过分析,这可能已更改为小 ;a' 。您可以尝试一下吗?
  • 你说的完全正确——谢谢。

标签: groovy elasticsearch


【解决方案1】:

@VineetMohan 关于值是'a' 而不是'A' 很可能是正确的。

您可以通过将值作为脚本字段返回来检查这些值的索引方式:

$ curl -XGET localhost:9200/test/_search -d '
{
  "script_fields": {
    "status": {
      "script": "doc[\"membership.status\"].values"
    }
  }
}
'

从那里,它应该表明您实际使用的是什么。很可能基于名称和您的使用情况,you will want to reindex (recreate) your data so that membership.status is mapped as a not_analyzed string。如果完成,那么您将无需担心任何内容的小写。

与此同时,您可能可以通过:

return _score + (doc['membership.status'].value == 'a' ? 2 : 0)

顺便说一句,您不应该使用动态脚本。在生产环境中使用存储的脚本来避免安全问题。

【讨论】:

  • 通过script_fields检查值而不是_source文档中存储的值,我发现不仅'A'小写,而且还被括在括号中。前者很有意义,但我觉得后者有点奇怪(鉴于该值被映射为字符串)。设置 s = doc['membership.status'].value[0],然后根据“a”检查 s 就可以了。
  • 它的括号性质很大程度上与我在输出中使用values 而不是value 以及script_fields 显示内容的方式有关。除非它还返回多个值,否则不要太担心,已分析字符串很容易这样做。
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 2013-11-22
  • 2012-08-12
  • 1970-01-01
  • 2021-03-08
  • 2011-12-19
  • 1970-01-01
相关资源
最近更新 更多