Mixing bool and multi match/function score query


(gkwelding) #1

I'm currently doing a query that's a mix of multi match and function score.
The important bit of the JSON looks like this:

    "function_score":{
        "query":{
            "query_string":{
                "query":"some query",

"fields":["id","name","strippedDescription","colourSearch","sizeSearch"]
}
}
}

However, I also want to include results that don't necessarily match the
query but have a particular numeric value that's greater than 0. I think a
bool query would do this, but I don't know how to use a bool query with a
function score query.

I understand that a multi match query is just shorthand for a bool query,
and I could expand out the multi match query into its bool counter-part,
however, I then don't know how I would do function score within that.

Any ideas? I'm on version 1.1.0 by the way.

--
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/4279a874-eef8-47ec-9f49-f91efed1f851%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(Britta Weber) #2

Hi,

I am unsure I got that right - the query in the function_score can be
any query, also a bool query. If you want documents that do not match
the above query, but some other criterion (for example range query) to
be scored with the function_score functions you can just replace the
query_string with a
"bool" : {"should": [{"query_string:{...}"}, {"range": {...}}]}.
Was that your question?
If not, could you elaborate a little more on what you want to achieve?

On Wed, Apr 2, 2014 at 5:01 PM, Garry Welding gkwelding@gmail.com wrote:

I'm currently doing a query that's a mix of multi match and function score.
The important bit of the JSON looks like this:

    "function_score":{
        "query":{
            "query_string":{
                "query":"some query",

"fields":["id","name","strippedDescription","colourSearch","sizeSearch"]
}
}
}

However, I also want to include results that don't necessarily match the
query but have a particular numeric value that's greater than 0. I think a
bool query would do this, but I don't know how to use a bool query with a
function score query.

I understand that a multi match query is just shorthand for a bool query,
and I could expand out the multi match query into its bool counter-part,
however, I then don't know how I would do function score within that.

Any ideas? I'm on version 1.1.0 by the way.

--
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/4279a874-eef8-47ec-9f49-f91efed1f851%40googlegroups.com.
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/CALhJbBguv2u8W3%2BDvosYY4Y7xv7fkqCP-9A4WBSVdg2_1MQHJg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.


(gkwelding) #3

Hey, thanks for getting back to me, but with a little more thought I
actually figured this out. What I needed was this...

{
    "query":{
        "function_score":{
            "query":{
                "bool":{
                    "should": [
                       {
                           "range": {
                              "allBoost": {
                                 "gt": 0
                              }
                           }
                       },{
                            "multi_match":{
                                "query":"some search query",
                                "fields":[
                                    "id",
                                    "name",
                                    "description",
                                    "category"
                                ]
                            }
                       }
                    ]
                }
            },
            "functions":[
                {
                    "filter":{
                        "range": {
                            "allBoost": {
                                "gt": 0
                            }
                        }
                    },
                    "script_score":{
                        "script":"doc['allBoost'].value"
                    }
                },
                {
                    "filter":{
                        "range": {
                            "allBoost": {
                                "lte": 0
                            }
                        }
                    },
                    "script_score":{
                        "script":"_score"
                    }
                }
            ],
            "boost_mode": "replace"
        }
    }
}

What was missing was the knowledge that you could nest multi field queries
within bool queries...

On Thursday, April 3, 2014 9:45:06 AM UTC+1, Britta Weber wrote:

Hi,

I am unsure I got that right - the query in the function_score can be
any query, also a bool query. If you want documents that do not match
the above query, but some other criterion (for example range query) to
be scored with the function_score functions you can just replace the
query_string with a
"bool" : {"should": [{"query_string:{...}"}, {"range": {...}}]}.
Was that your question?
If not, could you elaborate a little more on what you want to achieve?

On Wed, Apr 2, 2014 at 5:01 PM, Garry Welding <gkwe...@gmail.com<javascript:>>
wrote:

I'm currently doing a query that's a mix of multi match and function
score.
The important bit of the JSON looks like this:

    "function_score":{ 
        "query":{ 
            "query_string":{ 
                "query":"some query", 

"fields":["id","name","strippedDescription","colourSearch","sizeSearch"]
}
}
}

However, I also want to include results that don't necessarily match the
query but have a particular numeric value that's greater than 0. I think
a
bool query would do this, but I don't know how to use a bool query with
a
function score query.

I understand that a multi match query is just shorthand for a bool
query,
and I could expand out the multi match query into its bool counter-part,
however, I then don't know how I would do function score within that.

Any ideas? I'm on version 1.1.0 by the way.

--
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/4279a874-eef8-47ec-9f49-f91efed1f851%40googlegroups.com.

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/e1d8c456-d62a-498e-a805-ac40e40131d5%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


(system) #4