Boost based on field value

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Boost based on field value

Enrique Medina Montenegro
Hi,

I was wondering whether it's possible to boost a field based on its value. Let me explain my scenario.

At my website, we're indexing products from different shops, but the book shops are the ones with most products, so when I search for "iphone", let's say, I get most of the first results with books interwingled.

Would it be possible to negatively boost based on whether the record is a book (I have a field which specifies the category, so I could identify it with no issues)?

The idea would be to boost results that are not books, but without losing the books, of course. Just would like to push them further in terms of relevance.

Thanks.
Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Ivan Brusic
Hi Enrique,

Not sure if I fully understand your use base, but you want to change the boost depending on the query?  For example, changing the category boost if the query is for iPhone?  You can look at the query before you send the request to ES and change the boost accordingly.  I believe every query type has a boost attribute.

There is something called a Boost Query, which I have never tried, but is not might not be what you are looking for since you need to affect the boost on a field that is not search on:


If you simply want to lower the boost for any results from the book store, why not set the boost for the category type in the mapping?


Ivan


On Fri, Apr 8, 2011 at 11:02 AM, Enrique Medina Montenegro <[hidden email]> wrote:
Hi,

I was wondering whether it's possible to boost a field based on its value. Let me explain my scenario.

At my website, we're indexing products from different shops, but the book shops are the ones with most products, so when I search for "iphone", let's say, I get most of the first results with books interwingled.

Would it be possible to negatively boost based on whether the record is a book (I have a field which specifies the category, so I could identify it with no issues)?

The idea would be to boost results that are not books, but without losing the books, of course. Just would like to push them further in terms of relevance.

Thanks.

Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Enrique Medina Montenegro
Issue is I can have other categories, so just boosting the field category would have side effects.

Basically I would like to be able to do something like this:

"Get me all the products which match "iphone", but leave the results coming from a product whose "category1=books" at the end, so the ones coming from other categories, like "electronics or computers" are "more relevant"...


On Fri, Apr 8, 2011 at 5:54 PM, Ivan Brusic <[hidden email]> wrote:
Hi Enrique,

Not sure if I fully understand your use base, but you want to change the boost depending on the query?  For example, changing the category boost if the query is for iPhone?  You can look at the query before you send the request to ES and change the boost accordingly.  I believe every query type has a boost attribute.

There is something called a Boost Query, which I have never tried, but is not might not be what you are looking for since you need to affect the boost on a field that is not search on:


If you simply want to lower the boost for any results from the book store, why not set the boost for the category type in the mapping?


Ivan


On Fri, Apr 8, 2011 at 11:02 AM, Enrique Medina Montenegro <[hidden email]> wrote:
Hi,

I was wondering whether it's possible to boost a field based on its value. Let me explain my scenario.

At my website, we're indexing products from different shops, but the book shops are the ones with most products, so when I search for "iphone", let's say, I get most of the first results with books interwingled.

Would it be possible to negatively boost based on whether the record is a book (I have a field which specifies the category, so I could identify it with no issues)?

The idea would be to boost results that are not books, but without losing the books, of course. Just would like to push them further in terms of relevance.

Thanks.


Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

AGuereca
Hi Enrique,

I would give a try to Custom_Score:

http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html

There you can teak the score according to you criteria.


~AG
Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Clinton Gormley
In reply to this post by Enrique Medina Montenegro
Hi Enrique

On Fri, 2011-04-08 at 18:06 +0200, Enrique Medina Montenegro wrote:
> Issue is I can have other categories, so just boosting the field
> category would have side effects.

You can specify boosts in most (all?) query types - these boosts are
included in the score calculation.

For instance you could do:

{
  query: {
    term: {
       category: {
          value: "iphone",
          boost: 2
}}}}

Note: this is a term QUERY not a term FILTER.

For an example, see:
http://www.elasticsearch.org/guide/reference/query-dsl/term-query.html
>
You will need to play with the boost values to figure out what the right
number is.

Using explain helps with this:
http://www.elasticsearch.org/guide/reference/api/search/explain.html

clint



Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Enrique Medina Montenegro
Clinton,

I'm currently using "query_string" for my queries, but boost here is applied to the whole query, not just a specific field. How could I specify the boost for a field in this type of query?

Thanks.

On Fri, Apr 8, 2011 at 8:21 PM, Clinton Gormley <[hidden email]> wrote:
Hi Enrique

On Fri, 2011-04-08 at 18:06 +0200, Enrique Medina Montenegro wrote:
> Issue is I can have other categories, so just boosting the field
> category would have side effects.

You can specify boosts in most (all?) query types - these boosts are
included in the score calculation.

For instance you could do:

{
 query: {
   term: {
      category: {
         value: "iphone",
         boost: 2
}}}}

Note: this is a term QUERY not a term FILTER.

For an example, see:
http://www.elasticsearch.org/guide/reference/query-dsl/term-query.html
>
You will need to play with the boost values to figure out what the right
number is.

Using explain helps with this:
http://www.elasticsearch.org/guide/reference/api/search/explain.html

clint




Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Clinton Gormley
Hi Enrique
>
>
> I'm currently using "query_string" for my queries, but boost here is
> applied to the whole query, not just a specific field. How could I
> specify the boost for a field in this type of query?

http://lucene.apache.org/java/3_0_0/queryparsersyntax.html

You could do: "title:(war peace)^5 summary:(war peace)^2 war peace"

which would boost the title field by 5, the summary field by 2, and use
the default boost for the _all field

clint



Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Enrique Medina Montenegro
Thanks a lot!

In the meantime, I was searching the custom_score_query, but I just cannot make the query work (I send it but I never get a response back, and there's nothing in the logs). Do you know what could be wrong with this query?


On Mon, Apr 11, 2011 at 10:36 AM, Clinton Gormley <[hidden email]> wrote:
Hi Enrique
>
>
> I'm currently using "query_string" for my queries, but boost here is
> applied to the whole query, not just a specific field. How could I
> specify the boost for a field in this type of query?

http://lucene.apache.org/java/3_0_0/queryparsersyntax.html

You could do: "title:(war peace)^5 summary:(war peace)^2 war peace"

which would boost the title field by 5, the summary field by 2, and use
the default boost for the _all field

clint




Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Ludovic Levesque
Hi Enrique,

in custom_score queries, the mvel script is directly in the 'script'
part, not in script.script
see http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html
for example

See https://gist.github.com/913260#gistcomment-26697

Ludo

On Mon, Apr 11, 2011 at 10:54 AM, Enrique Medina Montenegro
<[hidden email]> wrote:

> Thanks a lot!
> In the meantime, I was searching the custom_score_query, but I just cannot
> make the query work (I send it but I never get a response back, and there's
> nothing in the logs). Do you know what could be wrong with this query?
> https://gist.github.com/913246
> On Mon, Apr 11, 2011 at 10:36 AM, Clinton Gormley <[hidden email]>
> wrote:
>>
>> Hi Enrique
>> >
>> >
>> > I'm currently using "query_string" for my queries, but boost here is
>> > applied to the whole query, not just a specific field. How could I
>> > specify the boost for a field in this type of query?
>>
>> http://lucene.apache.org/java/3_0_0/queryparsersyntax.html
>>
>> You could do: "title:(war peace)^5 summary:(war peace)^2 war peace"
>>
>> which would boost the title field by 5, the summary field by 2, and use
>> the default boost for the _all field
>>
>> clint
>>
>>
>>
>
>
Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Enrique Medina Montenegro
Ludovic,

I tried your query, but it doesn't do anything, i.e. I'm using elasticsearch-head JS client, and it displays requesting... but I never get a response back.

Any clue?

Regards.

On Mon, Apr 11, 2011 at 11:04 AM, Ludovic Levesque <[hidden email]> wrote:
Hi Enrique,

in custom_score queries, the mvel script is directly in the 'script'
part, not in script.script
see http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html
for example

See https://gist.github.com/913260#gistcomment-26697

Ludo

On Mon, Apr 11, 2011 at 10:54 AM, Enrique Medina Montenegro
<[hidden email]> wrote:
> Thanks a lot!
> In the meantime, I was searching the custom_score_query, but I just cannot
> make the query work (I send it but I never get a response back, and there's
> nothing in the logs). Do you know what could be wrong with this query?
> https://gist.github.com/913246
> On Mon, Apr 11, 2011 at 10:36 AM, Clinton Gormley <[hidden email]>
> wrote:
>>
>> Hi Enrique
>> >
>> >
>> > I'm currently using "query_string" for my queries, but boost here is
>> > applied to the whole query, not just a specific field. How could I
>> > specify the boost for a field in this type of query?
>>
>> http://lucene.apache.org/java/3_0_0/queryparsersyntax.html
>>
>> You could do: "title:(war peace)^5 summary:(war peace)^2 war peace"
>>
>> which would boost the title field by 5, the summary field by 2, and use
>> the default boost for the _all field
>>
>> clint
>>
>>
>>
>
>

Reply | Threaded
Open this post in threaded view
|

Re: Boost based on field value

Enrique Medina Montenegro
Just for the records, I eventually accomplished what I was looking for with this query:

https://gist.github.com/913260#gistcomment-26720

On Mon, Apr 11, 2011 at 11:11 AM, Enrique Medina Montenegro <[hidden email]> wrote:
Ludovic,

I tried your query, but it doesn't do anything, i.e. I'm using elasticsearch-head JS client, and it displays requesting... but I never get a response back.

Any clue?

Regards.


On Mon, Apr 11, 2011 at 11:04 AM, Ludovic Levesque <[hidden email]> wrote:
Hi Enrique,

in custom_score queries, the mvel script is directly in the 'script'
part, not in script.script
see http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html
for example

See https://gist.github.com/913260#gistcomment-26697

Ludo

On Mon, Apr 11, 2011 at 10:54 AM, Enrique Medina Montenegro
<[hidden email]> wrote:
> Thanks a lot!
> In the meantime, I was searching the custom_score_query, but I just cannot
> make the query work (I send it but I never get a response back, and there's
> nothing in the logs). Do you know what could be wrong with this query?
> https://gist.github.com/913246
> On Mon, Apr 11, 2011 at 10:36 AM, Clinton Gormley <[hidden email]>
> wrote:
>>
>> Hi Enrique
>> >
>> >
>> > I'm currently using "query_string" for my queries, but boost here is
>> > applied to the whole query, not just a specific field. How could I
>> > specify the boost for a field in this type of query?
>>
>> http://lucene.apache.org/java/3_0_0/queryparsersyntax.html
>>
>> You could do: "title:(war peace)^5 summary:(war peace)^2 war peace"
>>
>> which would boost the title field by 5, the summary field by 2, and use
>> the default boost for the _all field
>>
>> clint
>>
>>
>>
>
>