Bool Queries and SHOULD/MUST combinations

Hi,

Below is my data and the two queries that I tested, first one failing and
the latter working. I start to believe that if one wants to combine several
SHOULD and MUST filters, the outer one must always be SHOULD. Is this a
correct assumption? In our application, we have much more complex situation
with several filters within each MUST and SHOULD. And lastly, where should
place a MUST_NOT in this case?

Many thanks.

Here is my data:

_index,_type,_id,_score,_source.id,_source.type,_source.valueType,_source.sentence,_source.location
"test","var","0","1","0","study","text","Lorem text is jumbled","spain"
"test","var","1","1","1","study","text","bla bla bla","spain"
"test","var","2","1","2","schema","decimal","ipsum","germany"
"test","var","3","1","3","study","integer","lorem","france"

Here is my FAILING query:

{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": {
"terms": {
"location": [
"germany"
]
}
},
"should": {
"terms": {
"valueType": [
"integer"
]
}
}
}
}
}
}
}

Here is my WORKING query returning IDs 2 and 3:

{
"query": {
"bool": {
"should": [
{
"terms": {
"location": [
"germany"
]
}
},
{
"bool": {
"should": [
{
"terms": {
"valueType": [
"integer"
]
}
}
]
}
}
]
}
}
}

--
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/30406d09-5b43-4fa1-b74e-3feaba44f67e%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

I think you have other errors in your setup than what is visible in the
query you show.

If you use this

both queries work fine, as expected.

For the question about boolean logic, you can think of "should" as an "or",
and "must" as an "and" operation.

Jörg

On Sat, Nov 1, 2014 at 8:57 PM, kazoompa rhaeri@p3g.org wrote:

Hi,

Below is my data and the two queries that I tested, first one failing and
the latter working. I start to believe that if one wants to combine several
SHOULD and MUST filters, the outer one must always be SHOULD. Is this a
correct assumption? In our application, we have much more complex situation
with several filters within each MUST and SHOULD. And lastly, where should
place a MUST_NOT in this case?

Many thanks.

Here is my data:

_index,_type,_id,_score,_source.id,_source.type,_source.valueType,_source.sentence,_source.location
"test","var","0","1","0","study","text","Lorem text is jumbled","spain"
"test","var","1","1","1","study","text","bla bla bla","spain"
"test","var","2","1","2","schema","decimal","ipsum","germany"
"test","var","3","1","3","study","integer","lorem","france"

Here is my FAILING query:

{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": {
"terms": {
"location": [
"germany"
]
}
},
"should": {
"terms": {
"valueType": [
"integer"
]
}
}
}
}
}
}
}

Here is my WORKING query returning IDs 2 and 3:

{
"query": {
"bool": {
"should": [
{
"terms": {
"location": [
"germany"
]
}
},
{
"bool": {
"should": [
{
"terms": {
"valueType": [
"integer"
]
}
}
]
}
}
]
}
}
}

--
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.
To view this discussion on the web visit
https://groups.google.com/d/msgid/elasticsearch/30406d09-5b43-4fa1-b74e-3feaba44f67e%40googlegroups.com
https://groups.google.com/d/msgid/elasticsearch/30406d09-5b43-4fa1-b74e-3feaba44f67e%40googlegroups.com?utm_medium=email&utm_source=footer
.
For more options, visit https://groups.google.com/d/optout.

--
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/CAKdsXoFNk3fqb0-BNNUj_P2wxFPinZEow1MKf9pwso2Y41_XoQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Thanks Jörg for the response, I had a mistake in my question and I had to
delete and re-post it.

Here is how I did the indexing (never mind the data, it is randomly
created) and I don't think there is any error in the method that I know of :

curl -XPUT 'http://localhost:9200/test/var/0' -d '{"id": "0", "type":
"schema", "valueType": "integer", "sentence": "Lorem text is jumbled",
"location": "germany"}'
curl -XPUT 'http://localhost:9200/test/var/1' -d '{"id": "1", "type":
"schema", "valueType": "decimal", "sentence": "bla bla bla", "location":
"united states"}'
curl -XPUT 'http://localhost:9200/test/var/2' -d '{"id": "2", "type":
"study", "valueType": "decimal", "sentence": "ipsum is the dude",
"location": "france"}'
curl -XPUT 'http://localhost:9200/test/var/3' -d '{"id": "3", "type":
"study", "valueType": "text", "sentence": "jumbled mama", "location":
"france"}'

You can always have a look at the revised question and share your wisdom
with me :slight_smile:

Cheers.

On Saturday, November 1, 2014 7:18:11 PM UTC-4, Jörg Prante wrote:

I think you have other errors in your setup than what is visible in the
query you show.

If you use this

Must/should filter · GitHub

both queries work fine, as expected.

For the question about boolean logic, you can think of "should" as an
"or", and "must" as an "and" operation.

Jörg

On Sat, Nov 1, 2014 at 8:57 PM, kazoompa <rha...@p3g.org <javascript:>>
wrote:

Hi,

Below is my data and the two queries that I tested, first one failing and
the latter working. I start to believe that if one wants to combine several
SHOULD and MUST filters, the outer one must always be SHOULD. Is this a
correct assumption? In our application, we have much more complex situation
with several filters within each MUST and SHOULD. And lastly, where should
place a MUST_NOT in this case?

Many thanks.

Here is my data:

_index,_type,_id,_score,_source.id,_source.type,_source.valueType,_source.sentence,_source.location
"test","var","0","1","0","study","text","Lorem text is jumbled","spain"
"test","var","1","1","1","study","text","bla bla bla","spain"
"test","var","2","1","2","schema","decimal","ipsum","germany"
"test","var","3","1","3","study","integer","lorem","france"

Here is my FAILING query:

{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": {
"terms": {
"location": [
"germany"
]
}
},
"should": {
"terms": {
"valueType": [
"integer"
]
}
}
}
}
}
}
}

Here is my WORKING query returning IDs 2 and 3:

{
"query": {
"bool": {
"should": [
{
"terms": {
"location": [
"germany"
]
}
},
{
"bool": {
"should": [
{
"terms": {
"valueType": [
"integer"
]
}
}
]
}
}
]
}
}
}

--
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 elasticsearc...@googlegroups.com <javascript:>.
To view this discussion on the web visit
https://groups.google.com/d/msgid/elasticsearch/30406d09-5b43-4fa1-b74e-3feaba44f67e%40googlegroups.com
https://groups.google.com/d/msgid/elasticsearch/30406d09-5b43-4fa1-b74e-3feaba44f67e%40googlegroups.com?utm_medium=email&utm_source=footer
.
For more options, visit https://groups.google.com/d/optout.

--
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/244b5486-d5e8-4584-a429-609e2a3ce111%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.