Solr negative boost

2019-08-15 08:46发布

I'm looking into the possibility of de-boosting a set of documents during query time. In my application, when I search for e.g. "preferences", I want to de-boost content tagged with ContentGroup:"Developer" or in other words, push those content back in the order. Here's the catch. I've the following weights on query fields and boost query on source

qf=text^6 title^15 IndexTerm^8

As you can see, title has a higher weight.

Now, a bunch of content tagged with ContentGroup:"Developer" consists of a title like "Preferences.material" or "Preferences Property" or "Preferences.graphics". The boost on title pushes these documents at the top.

What I'm looking is to see if there's a way to deboost all documents that are tagged with ContentGroup:"Developer" irrespective of the term occurrence is text or title. I tried something like, but didn't make any difference.

Source:simplecontent^10 Source:Help^20 (-ContentGroup-local:("Developer"))^99

I'm using edismax query parser.

Any pointers will be appreciated.

Thanks,

Shamik

1条回答
对你真心纯属浪费
2楼-- · 2019-08-15 09:41

You're onto something with your last attempt, but you have to start with *:*, so that you actually have something to subtract the documents from. The resulting set of documents (those not matching your query) can then be boosted.

From the Solr Relevancy FAQ

How do I give a negative (or very low) boost to documents that match a query?

True negative boosts are not supported, but you can use a very "low" numeric boost value on query clauses. In general the problem that confuses people is that a "low" boost is still a boost, it can only improve the score of documents that match. For example, if you want to find all docs matching "foo" or "bar" but penalize the scores of documents matching "xxx" you might be tempted to try...

q = foo^100 bar^100 xxx^0.00001 # NOT WHAT YOU WANT

...but this will still help a document matching all three clauses score higher then a document matching only the first two. One way to fake a "negative boost" is to give a large boost to everything that does not match. For example...

q = foo^100 bar^100 (*:* -xxx)^999

NOTE: When using (e)dismax, people sometimes expect that specifying a pure negative query with a large boost in the "bq" param will work (since Solr automatically makes top level purely negative positive queries by adding an implicit ":" -- but this doesn't work with "bq", because of how queries specified via "bq" are added directly to the main query. You need to be explicit...

?defType=dismax&q=foo bar&bq=(*:* -xxx)^999

查看更多
登录 后发表回答