Java 基于值列表获取Elasticsearch匹配
我正在使用Logstash将数据库中的数据输入Elasticsearch。 对于特定的SQL查询,我有一列以CSV形式检索值,如“role1;role2;role3”。 此列在Elastic中被索引为常规字符串 问题: 我需要根据另一个值列表对该字段进行弹性查询 例如:在java端,我有一个值为“role3”、“role4”、“role5”的集合,在此基础上,我应该获得与“role3”、“role4”或“role5”匹配的所有弹性记录 在这种情况下,我的弹性数据如下:Java 基于值列表获取Elasticsearch匹配,java,
elasticsearch,logstash,Java,
elasticsearch,Logstash,我正在使用Logstash将数据库中的数据输入Elasticsearch。 对于特定的SQL查询,我有一列以CSV形式检索值,如“role1;role2;role3”。 此列在Elastic中被索引为常规字符串 问题: 我需要根据另一个值列表对该字段进行弹性查询 例如:在java端,我有一个值为“role3”、“role4”、“role5”的集合,在此基础上,我应该获得与“role3”、“role4”或“role5”匹配的所有弹性记录 在这种情况下,我的弹性数据如下: "_source": {
"_source": {
"userName": "user1",
"roles": "role1;role2;role3"
}
"_source": {
"userName": "user2",
"roles": "role7;role8;role9"
}
在这种情况下,它应该返回“user1”的记录,因为它获得了“role3”的匹配项
问题:
最好的方法是什么?
我可以对java列表中的所有iTen使用类似like运算符的查询:
//javaList collection has 3 items: "role3", "role4" and "role5"
for (String role: javaList) {
query = QueryBuilders.boolQuery();
query.should(QueryBuilders.wildcardQuery("roles", "*" + role + "*"));
response = client.prepareSearch(indexName).setQuery(query).setTypes(type).execute().actionGet();
hits = response.getHits();
}
然后迭代每个命中,但这听起来像是一个非常糟糕的方法,因为javaList可以有20多个iten,这意味着需要20个查询
我需要一个方法告诉Elastic:
This is my list of roles, query internally and retrieve
only the records that matches at least one of those roles.
为了做到这一点,我明白我不能将数据作为字符串索引,对吗?理想情况下,它应该是一个数组或类似的东西
如何以最有效的方式实现这一点?您绝对不应该在循环中使用通配符查询。此解决方案最终将显示较差的性能 由于
角色
字段是常规文本字段,因此Elasticsearch将值“role1;role2;role3”拆分为单独的标记“role1”、“role2”和“role3”。对搜索查询应用相同的操作。您可以使用查询字符串“role3;role4;role5”的简单匹配查询,并因“role3”标记匹配而被命中
您还可以将角色
字段索引为字符串数组,并且相同的匹配查询仍然有效