Boost based on field value


(Enrique Medina Montenegro) #1

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.


(Ivan Brusic) #2

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:

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

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?

http://www.elasticsearch.org/guide/reference/mapping/boost-field.html

Ivan

On Fri, Apr 8, 2011 at 11:02 AM, Enrique Medina Montenegro <
e.medina.m@gmail.com> 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.


(Enrique Medina Montenegro) #3

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 ivan@brusic.com 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:

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

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?

http://www.elasticsearch.org/guide/reference/mapping/boost-field.html

Ivan

On Fri, Apr 8, 2011 at 11:02 AM, Enrique Medina Montenegro <
e.medina.m@gmail.com> 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.


(AGuereca) #4

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


(Clinton Gormley) #5

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


(Enrique Medina Montenegro) #6

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 clinton@iannounce.co.ukwrote:

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


(Clinton Gormley) #7

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


(Enrique Medina Montenegro) #8

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
clinton@iannounce.co.ukwrote:

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


(Ludovic Levesque) #9

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
e.medina.m@gmail.com 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 clinton@iannounce.co.uk
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


(Enrique Medina Montenegro) #10

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 luddic@gmail.com 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
e.medina.m@gmail.com 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 <
clinton@iannounce.co.uk>
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


(Enrique Medina Montenegro) #11

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

On Mon, Apr 11, 2011 at 11:11 AM, Enrique Medina Montenegro <
e.medina.m@gmail.com> 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 luddic@gmail.comwrote:

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
e.medina.m@gmail.com 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 <
clinton@iannounce.co.uk>
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


(system) #12