首页 > 解决方案 > 字段的弹性搜索连接

问题描述

我是弹性搜索的新手,想解决一个有以下问题的用例

我有一些文件格式如下

{
 "member_id":"number"
 "e_id":"number",
 "c_id":"number",
 "salary":"float"
}

在我的 Java 应用程序中,我将获得一个字符串输入,并且需要找到匹配文档的member_id。查找文档的算法如下

STEP 1:将输入字符串作为“keyInput”。
STEP 2: Concat "e_id","c_id" and ceil("salary") as "concatedData"
STEP 3:如果 "concatedData" 等于 "keyInput" THEN 返回匹配文档的 "member_id"。

STEP 2 需要在 Elasticsearch 中执行。

任何人都可以帮助弄清楚这种行为是否可以在 ES 上执行,如果是,那么如何?

提前致谢。

标签: elasticsearch

解决方案


有两种方法可以解决这个问题。

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相应地过滤文档。


推荐阅读