CopyPastor

Detecting plagiarism made easy.

Score: 0.8202787041664124; Reported for: String similarity Open both answers

Possible Plagiarism

Plagiarized on 2022-07-03
by brugia

Original Post

Original - Posted on 2015-02-16
by Jesse



            
Present in both answers; Present only in the new answer; Present only in the old answer;

You need to combine bool clauss, with "must" and "should". Find below the required query for the first statement
``` GET _search { "query": { "bool": { "must": [ { "term": { "on_sale": { "value": "True" } } }, { "bool": { "should": [ { "bool": { "must": [ { "term": { "type": { "value": "orange" } } }, { "range": { "price": { "gte": 10 } } } ] } }, { "bool": { "must": [ { "term": { "type": { "value": "apple" } } }, { "range": { "price": { "gte": 8 } } } ] } } ] } } ] } } } ```
It is just about wrapping "must" or "Should" clauses into one another as required. You need a little bit of practise to figure out how to chain them. But literally any combination can be queried using this kind of syntax.
For the second query:
``` { "query": { "bool": { "must": [ { "terms": { "type": [ "ornage", "apple" ] } }, { "bool": { "should": [ { "term": { "on_sale": { "value": "True" } } }, { "range": { "price": { "gte": 10 } } } ] } } ] } } } ```
When you need "and" use "MUST", when you need "or" use "SHOULD".
HTH.
I finally managed to create a query that does exactly what i wanted to have:
A filtered nested boolean query. I am not sure why this is not documented. Maybe someone here can tell me?
Here is the query:
GET /test/object/_search { "from": 0, "size": 20, "sort": { "_score": "desc" }, "query": { "filtered": { "filter": { "bool": { "must": [ { "term": { "state": 1 } } ] } }, "query": { "bool": { "should": [ { "bool": { "must": [ { "match": { "name": "foo" } }, { "match": { "name": "bar" } } ], "should": [ { "match": { "has_image": { "query": 1, "boost": 100 } } } ] } }, { "bool": { "must": [ { "match": { "info": "foo" } }, { "match": { "info": "bar" } } ], "should": [ { "match": { "has_image": { "query": 1, "boost": 100 } } } ] } } ], "minimum_should_match": 1 } } } } }
In pseudo-SQL:
SELECT * FROM /test/object WHERE ((name=foo AND name=bar) OR (info=foo AND info=bar)) AND state=1

Please keep in mind that it depends on your document field analysis and mappings how name=foo is internally handled. This can vary from a fuzzy to strict behavior.
"minimum_should_match": 1 says, that at least one of the should statements must be true.

This statements means that whenever there is a document in the resultset that contains has_image:1 it is boosted by factor 100. This changes result ordering.
"should": [ { "match": { "has_image": { "query": 1, "boost": 100 } } } ]

Have fun guys :)

        
Present in both answers; Present only in the new answer; Present only in the old answer;