oreno
(oreno)
July 23, 2013, 9:09am
1
Hi, I'm trying to write a bool query that will act such as (event_time in range) AND (at least one of the should condition is correct)
I implemented it as:
{
"query": {
"bool": {
"must":
{
"range": {
"events.event_time": {
"from": "2013-06-01",
"to": "2013-06-03",
"include_lower": true,
"include_upper": true
}
}
},
"should": {
"term": {
"events.products.product": "1772166"
}
}
,"minimum_should_match" : 1
}
},
"path": "events"
}
But it seems like the condition between the MUST and the SHOULD conditions is an OR instead of an AND, so I get a lot more results than I should.
I read in the link below that:"In the query after this, a boolean query gets created, and in this query, "mushrooms" must be present, but "steak" should be present. If "steak" is not present but "mushrooms" is present for a document, it will be still returned as a hit ."
http://www.avajava.com/tutorials/lessons/how-do-i-combine-queries-with-a-boolean-query.html
So I understand that these 2 operations are having an OR between them. Any idea how can I make them combined under an AND condition?
Please not that the should condition should contain more then one product(but at least one should match).
Ivan
(Ivan Brusic)
July 23, 2013, 4:44pm
2
Why not simply convert the should clause into a must clause? It appears
that is what you want.
Here is another good writeup on boolean queries:
http://searchhub.org/2011/12/28/why-not-and-or-and-not/
--
Ivan
On Tue, Jul 23, 2013 at 2:09 AM, oreno oreno@exelate.com wrote:
Hi, I'm trying to write a bool query that will act such as (event_time in
range) AND (at least one of the should condition is correct)
I implemented it as:
{
"query": {
"bool": {
"must":
{
"range": {
"events.event_time": {
"from": "2013-06-01",
"to": "2013-06-03",
"include_lower": true,
"include_upper": true
}
}
},
"should": {
"term": {
"events.products.product": "1772166"
}
}
,"minimum_should_match" : 1
}
},
"path": "events"
}
But it seems like the condition between the MUST and the SHOULD conditions
is an OR instead of an AND, so I get a lot more results than I should.
I read in the link below that:"In the query after this, a boolean query
gets
created, and in this query, "mushrooms" must be present, but "steak" should
be present. If "steak" is not present but "mushrooms" is present for a
document, it will be still returned as a hit ."
How do I combine queries with a boolean query? - Web Tutorials - avajava.com
So I understand that these 2 operations are having an OR between them. Any
idea how can I make them combined under an AND condition?
--
View this message in context:
http://elasticsearch-users.115913.n3.nabble.com/Bool-query-tp4038495.html
Sent from the Elasticsearch Users mailing list archive at Nabble.com .
--
You received this message because you are subscribed to the Google Groups
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an
email to elasticsearch+unsubscribe@googlegroups.com .
For more options, visit https://groups.google.com/groups/opt_out .
--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elasticsearch+unsubscribe@googlegroups.com .
For more options, visit https://groups.google.com/groups/opt_out .
oreno
(oreno)
July 24, 2013, 8:21am
3
Hi Ivan, I needed the range to be a must, but I needed another should
condition that will have an AND relation with the range.
I was able to solve this using the "terms" condition(since it's like
"should" that can work inside a must).
"must" : [ {
"range" : {
"events.event_time" : {
"from" : "2013-06-01",
"to" : "2013-06-03",
"include_lower" : true,
"include_upper" : true
}
}
}, {
"terms" : {
"events.segments.segment" : [ "80870","80871" ],
"minimum_should_match" : "1"
}
} ]
Thanks,
[image: Inline image 1]
*
*
Oren Orgad | Software Engineer | eXelate http://www.exelate.com/
p: +972- 72-2221329 | e: oreno@exelate.com
On Tue, Jul 23, 2013 at 7:44 PM, Ivan Brusic [via Elasticsearch Users] <
ml-node+s115913n4038549h54@n3.nabble.com > wrote:
Why not simply convert the should clause into a must clause? It appears
that is what you want.
Here is another good writeup on boolean queries:
http://searchhub.org/2011/12/28/why-not-and-or-and-not/
--
Ivan
On Tue, Jul 23, 2013 at 2:09 AM, oreno <[hidden email]http://user/SendEmail.jtp?type=node&node=4038549&i=0
wrote:
Hi, I'm trying to write a bool query that will act such as (event_time in
range) AND (at least one of the should condition is correct)
I implemented it as:
{
"query": {
"bool": {
"must":
{
"range": {
"events.event_time": {
"from": "2013-06-01",
"to": "2013-06-03",
"include_lower": true,
"include_upper": true
}
}
},
"should": {
"term": {
"events.products.product": "1772166"
}
}
,"minimum_should_match" : 1
}
},
"path": "events"
}
But it seems like the condition between the MUST and the SHOULD conditions
is an OR instead of an AND, so I get a lot more results than I should.
I read in the link below that:"In the query after this, a boolean query
gets
created, and in this query, "mushrooms" must be present, but "steak"
should
be present. If "steak" is not present but "mushrooms" is present for a
document, it will be still returned as a hit ."
How do I combine queries with a boolean query? - Web Tutorials - avajava.com
So I understand that these 2 operations are having an OR between them. Any
idea how can I make them combined under an AND condition?
--
View this message in context:
http://elasticsearch-users.115913.n3.nabble.com/Bool-query-tp4038495.html
Sent from the Elasticsearch Users mailing list archive at Nabble.com .
--
You received this message because you are subscribed to the Google Groups
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an
email to [hidden email]http://user/SendEmail.jtp?type=node&node=4038549&i=1
.
For more options, visit https://groups.google.com/groups/opt_out .
--
You received this message because you are subscribed to the Google Groups
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an
email to [hidden email]http://user/SendEmail.jtp?type=node&node=4038549&i=2
.
For more options, visit https://groups.google.com/groups/opt_out .
If you reply to this email, your message will be added to the discussion
below:
http://elasticsearch-users.115913.n3.nabble.com/Bool-query-tp4038495p4038549.html
To unsubscribe from Bool query, click herehttp://elasticsearch-users.115913.n3.nabble.com/template/NamlServlet.jtp?macro=unsubscribe_by_code&node=4038495&code=b3Jlbm9AZXhlbGF0ZS5jb218NDAzODQ5NXw4ODk1Mjk2Nzg=
.
NAMLhttp://elasticsearch-users.115913.n3.nabble.com/template/NamlServlet.jtp?macro=macro_viewer&id=instant_html!nabble%3Aemail.naml&base=nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.naml.namespaces.BasicNamespace-nabble.view.web.template.NabbleNamespace-nabble.view.web.template.NodeNamespace&breadcrumbs=notify_subscribers!nabble%3Aemail.naml-instant_emails!nabble%3Aemail.naml-send_instant_email!nabble%3Aemail.naml