如何使用Java在Elasticsearch中执行多个过滤器查询? [英] How to do multiple filter query in Elasticsearch using Java?

查看:1660
本文介绍了如何使用Java在Elasticsearch中执行多个过滤器查询?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经在弹性搜索之上构建了一个网络应用程序。我想使用Java做一个多重过滤器。



弹性搜索查询:

  {
query :{
bool:{
must:[
{match:{
T:TEXT},
match :{
new_content:TEXT
}
},

],
过滤器:{
:{
collection1:xyz
},
term:{
collection2:abc
}

我想过滤查询,以便在同一个字段中过滤 collection 有两个不同的值(例如,xyz和abc)



现在,我已经为单个过滤器编写了一个Java程序。 >

  BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.simpleQueryStringQuery(query).field(newContent)。字段(T))
.filter(QueryBuilders.termQuery(Collection1,abc));

如何在多个值的同一字段中过滤查询?



修改



实际上,在我的网络应用程序中,我已经将集合的值提取为: p>

  String [] Collection = request.getParameterValues(site); 

Collection是我的弹性搜索文档中的字段。假设 Collection [0] 是germany_collection(value:true), Collection [1] is usa_collection(value:true) 。我想写一个过滤我的文档的查询,以便在germany_collection:true和usa_collection:true的时候得到结果。



这是我的原始程序:

  public StringBuffer getJson查询,String start,String [] Collection {
Client client = TransportClient.builder()。build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(127.0.0.1),9300)) ;

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.simpleQueryStringQuery(query).field(newContent)。field(T))
。 filter(QueryBuilders.termQuery(Collection [0],true)。filter(QueryBuilders.termQuery(Collection [1],true);

但是当我应用此过滤器时,我收到此错误方法过滤器(TermsQueryBuilder)对于类型TermsQueryBuilder 未定义。它表示添加到方法接收器。

解决方案

您可以使用术语查询而不是多个术语查询:

  BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.simpleQueryStringQuery(query).field(newContent) .field(T))
.filter(QueryBuilders.termsQuery(Collection,abc,xyz));
^ ^ ^
| | |
使用带有多个值的termsQuery

更新



我很惊讶你的代码编译,因为你缺少一些括号,只是重写你的查询这样,它应该工作:



pre> BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.must(QueryBuilders.simpleQueryStringQuery(query).field(newContent)。field(T))
.filter(QueryBuilders.termQuery(Collection [0],true))
.filter(QueryBuilders.termQuery(Collection [1],true));


I have build a web app on top of elasticsearch. I would like to do a multiple filter using Java.

Elasticsearch Query:

{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "T": "TEXT"},
          "match": {
            "new_content": "TEXT"
          }
        },

      ],
      "filter": {
        "term": {
          "collection1": "xyz"
        },
        "term": {
          "collection2": "abc"
        }

I want to filter the query such that it should filter on the same field collection with two different values(for eg,"xyz" and "abc")

Right now, I have coded a Java program for the single filter.

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T"))
                .filter(QueryBuilders.termQuery(Collection1, "abc"));

How should I filter a query on a same field for multiple values?

Edit:

Actually in my web app, I have extracted the value of the collection as:

String[] Collection=request.getParameterValues("site");

Collection is the field in my elasticsearch documents. Suppose Collection[0] is germany_collection(value:true), Collection[1] is usa_collection(value:true). I want to write a query which filters my documents such that I will get results when germany_collection:true and usa_collection:true.

This is my original program:

public StringBuffer getJson(String query, String start, String [] Collection{
Client client = TransportClient.builder().build()
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T"))
                .filter(QueryBuilders.termQuery(Collection[0], "true").filter(QueryBuilders.termQuery(Collection[1], "true");

But when I did applied this filter, I am getting this error The method filter(TermsQueryBuilder) is undefined for the type TermsQueryBuilder. It says add cast to method reciever.

解决方案

You can use the terms query instead of multiple term queries:

BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
                .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T"))
                .filter(QueryBuilders.termsQuery(Collection, "abc", "xyz"));
                                          ^                    ^      ^
                                          |                    |      |
                                    use termsQuery      with multiple values

UPDATE

I'm surprised your code compiles at all because you're missing some closing parenthesis, just rewrite your query like this and it should work:

    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
            .must(QueryBuilders.simpleQueryStringQuery(query).field("newContent").field("T"))
            .filter(QueryBuilders.termQuery(Collection[0], "true"))
            .filter(QueryBuilders.termQuery(Collection[1], "true"));

这篇关于如何使用Java在Elasticsearch中执行多个过滤器查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆