字段的弹性搜索串联

时间:2019-01-30 10:42:34

标签: elasticsearch

我是弹性搜索的新手,并且想解决以下问题的用例

我有一些格式如下的文件

{
 "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上执行这种操作,如果可以,那么怎么办?

谢谢。

1 个答案:

答案 0 :(得分:1)

有两种解决方法。

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"
            }
          }
        }
      }
    }
  }
}

注意:应避免使用脚本,因为它会导致性能下降。我强烈建议您使用下面的第二种方法。

2。通过在索引时间连接值

为此,您要做的就是添加一个新字段,其数据类型为keyword,以存储级联值。然后使用term query相应地过滤文档。