elasticsearch - 字段的弹性搜索连接
问题描述
我是弹性搜索的新手,想解决一个有以下问题的用例
我有一些文件格式如下
{
"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 上执行,如果是,那么如何?
提前致谢。
解决方案
有两种方法可以解决这个问题。
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
相应地过滤文档。
推荐阅读
- java - 我正在尝试使用@OneToOne 作为双向映射来映射实体,但出现奇怪的异常
- php - 在具有 PHP 和 nodeJS 依赖项的项目之间集成覆盖率的最合适方法是什么?
- visual-studio-code - 如何强制vscode中的“调试控制台”接受gdb命令?
- c++ - C++ 规则 5 - 自定义析构函数的分段错误
- python - 如何在 Python 中模块化包含“with”的代码
- python - 如何让 Python 上的 OpenCv 播放已经从网络摄像头播放的视频?
- angular - 如何将 GrapesJS 与 Angular 集成?
- angular - 使用angular 9登录后如何在firestore中添加相应的用户数据?
- c++ - 哪个编译器对使用单例 CRTP 的模板参数类型的内联静态成员是正确的?
- spring-boot - Spring Security 是否允许未经身份验证的用户?这段代码有什么问题?