[英]Get Elasticsearch match based on list of values
我正在使用Logstash将数据从数据库输入到Elasticsearch。 对于特定的SQL查询,我有一列以CSV格式检索值,例如“ role1; role2; role3”。 该列在Elastic中被索引为常规字符串。
问题:我需要根据另一个值列表对该字段进行弹性查询。
例如 :在Java端,我有一个值如下的集合:“ role3”,“ role4”,“ role5”,基于此,我应该获取Elastic中与“ role3”,“ role4”或“ role5”匹配的所有记录”。
在这种情况下,我的弹性数据如下:
"_source": {
"userName": "user1",
"roles": "role1;role2;role3"
}
"_source": {
"userName": "user2",
"roles": "role7;role8;role9"
}
在这种情况下,它应返回“ user1”的记录,因为它与“ role3”匹配。
问题:做到这一点的最佳方法是什么? 我可以使用类似LIKE运算符的查询来查询我的Java列表的所有iten:
//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个以上的itens,这意味着要进行20次弹性查询。
我需要一种方法来告诉Elastic:
This is my list of roles, query internally and retrieve
only the records that matches at least one of those roles.
为了做到这一点,我理解我无法将该数据作为String索引吗? 理想情况下是将其具有数组或类似的东西...
我该如何以最高效的方式做到这一点?
绝对不应该在循环中使用通配符查询。 该解决方案最终将表现出较差的性能。
由于roles
字段是常规文本字段,因此Elasticsearch将值“ role1; role2; role3”拆分为单独的标记“ role1”,“ role2”和“ role3”。 相同的操作应用于搜索查询。 您可以将简单的匹配查询与查询字符串“ role3; role4; role5”结合使用,并由于“ role3”令牌匹配而被点击。
另外,您可以将roles
字段索引为字符串数组,并且相同的匹配查询仍将起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.