java searchfilter,如何使用Java在Elasticsearch中执行多个过滤器查询?

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"));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值