簡體   English   中英

Elasticsearch - 在查詢中將數組作為參數傳遞

[英]Elasticsearch - passing an array as argument in a query

我正在嘗試使用數組作為查詢的參數在Elasticsearch中進行查詢。 例如,我想在“水果”字段中搜索[蘋果,橙子,菠蘿]。 但在我的情況下,我想搜索一系列companyIds。 我提出了這個問題:

{  
   "query":{  
      "bool":{  
         "must":[  
            {  
               "range":{  
                  "eventconnected":{  
                     "from":"2018-11-21T15:00:00.023Z",
                     "to":"2018-11-22T15:00:00.023Z",
                     "include_lower":true,
                     "include_upper":true,
                     "boost":1.0
                  }
               }
            },
            {  
               "match":{  
                  "idunity":{  
                     "query":[  
                        "157",
                        "160"
                     ],
                     "operator":"OR",
                     "prefix_length":0,
                     "max_expansions":50,
                     "fuzzy_transpositions":true,
                     "lenient":false,
                     "zero_terms_query":"NONE",
                     "auto_generate_synonyms_phrase_query":true,
                     "boost":1.0
                  }
               }
            }
         ],
         "adjust_pure_negative":true,
         "boost":1.0
      }
   }
}

當我運行此查詢時,我收到以下錯誤:

{"error":{"root_cause":[{"type":"parsing_exception","reason":"[match] unknown token [START_ARRAY] after [query]","line":20,"col":30}],"type":"parsing_exception","reason":"[match] unknown token [START_ARRAY] after [query]","line":20,"col":30},"status":400}

就好像我不能將數組作為查詢的參數傳遞一樣。 所以我的問題是:在ElasticSearch中將數組作為查詢參數傳遞的正確方法是什么?

為了給出更多的上下文:我在java項目中這樣做,這個查詢的searchSourceBuilder如下:locaisTemp是我試圖作為參數傳遞的數組。

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
            sourceBuilder.query(QueryBuilders
                    .boolQuery()
                        .must(QueryBuilders
                            .rangeQuery("eventconnected")
                                .from(tempDate0.getTime())
                                .to(tempDate.getTime()))
                        .must(QueryBuilders
                                .matchQuery("idunity", locaisTemp)) 
                    ); 

使用termsQuery而且你應該使用filter()而不是must()因為你只是過濾:

                    ...
                    .filter(QueryBuilders
                       ^    .termsQuery("idunity", locaisTemp))
                       |         ^ 
                       |         |
                       change this 
                    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM