我是弹性搜索的新手,并且想解决以下问题的用例
我有一些格式如下的文件
{
"member_id":"number"
"e_id":"number",
"c_id":"number",
"salary":"float"
}
在我的Java应用程序中,我将获得一个String输入,并且需要找到匹配文档的 member_id 。查找文档的算法如下
步骤1:将输入字符串作为“ keyInput”。
步骤2:将Concat“ e_id”,“ c_id”和ceil(“ salary”)用作“ concatedData”
步骤3:如果“ concatedData”等于“ keyInput”,则返回匹配文档的“ member_id”。
第2步需要在Elasticsearch中执行。
任何人都可以帮忙弄清楚是否可以在ES上执行这种操作,如果可以,那么怎么办?
谢谢。
答案 0 :(得分:1)
有两种解决方法。
建议的映射:
"mappings": {
"_doc": {
"properties": {
"member_id": {
"type": "integer"
},
"e_id": {
"type": "integer"
},
"c_id": {
"type": "integer"
},
"salary": {
"type": "float"
}
}
}
}
查询:
{
"query": {
"bool": {
"filter": {
"script": {
"script": {
"source": "String.valueOf(doc['e_id'].value) + doc['c_id'].value + Math.ceil(doc['salary'].value).intValue() == params.inp",
"lang": "painless",
"params": {
"inp": "12345678"
}
}
}
}
}
}
}
注意:应避免使用脚本,因为它会导致性能下降。我强烈建议您使用下面的第二种方法。
为此,您要做的就是添加一个新字段,其数据类型为keyword
,以存储级联值。然后使用term query
相应地过滤文档。