Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于值列表获取Elasticsearch匹配_Java_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Logstash - Fatal编程技术网 elasticsearch,logstash,Java,elasticsearch,Logstash" /> elasticsearch,logstash,Java,elasticsearch,Logstash" />

Java 基于值列表获取Elasticsearch匹配

Java 基于值列表获取Elasticsearch匹配,java,elasticsearch,logstash,Java,elasticsearch,Logstash,我正在使用Logstash将数据库中的数据输入Elasticsearch。 对于特定的SQL查询,我有一列以CSV形式检索值,如“role1;role2;role3”。 此列在Elastic中被索引为常规字符串 问题: 我需要根据另一个值列表对该字段进行弹性查询 例如:在java端,我有一个值为“role3”、“role4”、“role5”的集合,在此基础上,我应该获得与“role3”、“role4”或“role5”匹配的所有弹性记录 在这种情况下,我的弹性数据如下: "_source": {

我正在使用Logstash将数据库中的数据输入Elasticsearch。 对于特定的SQL查询,我有一列以CSV形式检索值,如“role1;role2;role3”。 此列在Elastic中被索引为常规字符串

问题: 我需要根据另一个值列表对该字段进行弹性查询

例如:在java端,我有一个值为“role3”、“role4”、“role5”的集合,在此基础上,我应该获得与“role3”、“role4”或“role5”匹配的所有弹性记录

在这种情况下,我的弹性数据如下:

"_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”标记匹配而被命中

您还可以将
角色
字段索引为字符串数组,并且相同的匹配查询仍然有效