實現方法有3個:java
在建索引的時候設置boost,這個值會寫入文件,建索引時有額外的性能開銷;apache
在查詢的時候指定boost,這個值不會寫入文件,查詢時指定任意字段的boost值,適用與一個索引庫的多種查詢場景,但查詢時有額外性能開銷;性能
(推想)前二者結合使用,如絕大多數都須要標題優先,那麼建索引時可指定標題boost爲2,其餘場景可在查詢時指定標題boost爲0.5,中和建索引時的設置。url
這裏僅演示第二種方法:debug
id | title | content | 默認得分 | 指定標題boost值爲2後得分 |
108 | test | 開發筆記 開發筆記 開發筆記 開發筆記 開發筆記 | 1.6093808 | 1.0178617 |
107 | 開發筆記 | 1.439474 | 1.8208065 |
指定方法:code
這時doc 107已經排在上邊了:排序
debug query效果:索引
找到了方法,咱們不難得到在solrj中的實現:開發
package demo.service; import java.util.Iterator; import org.apache.log4j.Logger; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import base.util.ConfigUtil; public class SolrService { private static Logger log = Logger.getLogger(SolrService.class); private static HttpSolrServer solrServer; static { solrServer = new HttpSolrServer(ConfigUtil.getValue("solr.url")); solrServer.setConnectionTimeout(5000); } public static void main(String[] args) { SolrQuery query = new SolrQuery(); query.setQuery("title: 開發筆記^2 OR content:開發筆記"); QueryResponse rsp = null; try { rsp = solrServer.query(query); } catch (SolrServerException e) { log.error("Boost查詢時遇到錯誤:", e); } SolrDocumentList docs = rsp.getResults(); Iterator<SolrDocument> iter = docs.iterator(); while (iter.hasNext()) { SolrDocument doc = iter.next(); String idStr = doc.getFieldValue("id").toString(); int id = Integer.parseInt(idStr); String title = doc.getFieldValue("title").toString(); String content = doc.getFieldValue("content").toString(); System.out.println("id:"+id+" title:"+title+" content:"+content); } } }
注:由於咱們想設置的boost針對某字段,那麼在查詢在時候就不能再用拷貝字段了。get