`

solr boost设置

 
阅读更多

   当用solr或者lucene搜索的时候,如果想对不同类型的文章,或者不同的字段设置不同的权重,又或者对不同的搜索词语设置不同权重,则需要boost功能。 
1、boost设置方法 
     在索引时候设置boost,会消耗额外的内存;在查询的时候设置boost,会消耗cpu。 
     索引的时候,boost值是写入索引文件的,存储在标准化因子(.nrm)文件中,一旦设定,除非删除此文档,或者重写记录,否则无法改变。所以在查询的时候设置boost会更灵活。 
不设置的时候,默认boost为1.0。

solr以lucene为基础的,二者的boost是基本一样的,下面以lucene为例来说。 
//lucene索引的时候设置boost

Document doc = new Document();

Field f = new Field("contents", "hello world", Field.Store.NO, Field.Index.ANALYZED);

f.setBoost(100);//对某个字段设置权重

doc.add(f);

doc.setBoost(100);//对文档设置权重

//solrj索引的时候设置boost

doc.addField("title","中华",1.0f);//1.0f即是title域的boost

doc.setDocumentBoost(10.0f);//10.0f就是doc的boost

//查询的时候设置boost

查询的时候,只需在关键词后加上^10,这样就可设置权重,

比如:title:人民^10  表示title中匹配“人民”的记录,需要升高权重


2、boost设置原理

那么boost是如何影响lucene得分的呢? 
lucene 得分公式如下: 
score(q,d)   =coord(q,d) queryNorm(q) ∑( tf(t in d)  ·  idf(t)2  ·  t.getBoost() ·  norm(t,d) )t in q

 

其中:

t:Term,一个查询词,这里的Term是指包含域信息的Term,也即title:hello和content:hello是不同的Term 
d:doc,一个文档 
f:field 
coord(q,d):一次搜索可能包含多个搜索词,而一篇文档中也可能包含多个搜索词,此项表示,当一篇文档中包含的搜索词越多,则此文档则打分越高。 
queryNorm(q):计算每个查询条目的方差和,此值并不影响排序,而仅仅使得不同的query之间的分数可以比较。其公式是: 
public float queryNorm(float sumOfSquaredWeights) {

  return (float)(1.0 / Math.sqrt(sumOfSquaredWeights));

},而

public float sumOfSquaredWeights() {

  //除了用户指定的boost以外,其他都不计算在打分内

  queryWeight = getBoost();

  return queryWeight * queryWeight;

}

tf(t in d):Term t在文档d中出现的词频 
idf(t):Term t在几篇文档中出现过 
norm(t,d)   =   doc.getBoost()  ·  lengthNorm(field)  ·  ∏field.getBoost() 
                                                                                    field f in d  
norm(t,d)包括三个参数(都可以在自己的Similarity中影响打分,需要自己实现similarity): 
         Document boost:此值越大,说明此文档越重要。

         Field boost:此域越大,说明此域越重要。

          lengthNorm(field) = (1.0 / Math.sqrt(numTerms)):一个域中包含的Term总数越多,也即文档越长,此值越小,文档越短,此值越大。

        各类Boost值:

 

t.getBoost():term的boost,查询语句中每个词的权重,可以在查询中设定某个词更加重要,common^4 hello 
d.getBoost():doc的boost,文档权重,在索引阶段写入nrm文件,表明某些文档比其他文档更重要。 
f.getBoost():field的boost,域的权重,在索引阶段写入nrm文件,表明某些域比其他的域更重要。 
当然,也可以在添加Field的时候,设置Field.Index.ANALYZED_NO_NORMS或Field.Index.NOT_ANALYZED_NO_NORMS,完全不用norm,来节约空间。 
    没有norms意味着索引阶段禁用了文档boost和域的boost及长度标准化。好处在于节省内存,不用在搜索阶段为索引中的每篇文档的每个域都占用一个字节来保存norms信息了。 
   但是对norms信息的禁用是必须全部域都禁用的,一旦有一个域不禁用,则其他禁用的域也会存放默认的norms值。因为为了加快norms的搜索速度,Lucene是根据文档号乘以每篇文档的norms信息所占用的大小来计算偏移量的,中间少一篇文档,偏移量将无法计算。也即norms信息要么都保存,要么都不保存。

分享到:
评论

相关推荐

    solr创建索引的原理及解析

    ### Solr创建索引的原理及解析 #### 一、Solr概述与索引机制 Apache Solr是一款基于Lucene的高性能全文检索服务器,广泛应用于网站的搜索功能中。Solr支持分布式部署,并且提供了丰富的API接口,方便与其他系统...

    使用xml更新solr索引

    `<doc>`元素可以有可选属性`boost`,用于设置文档的评分,影响搜索结果的排序。默认值为1.0,更大的值会导致文档在搜索结果中排名更高。例如: ```xml <doc boost="2.5"> <field name="employeeId">05991 ...

    Solr评分整理汇总.docx

    Solr 的 DisMaxQParserPlugin 通过配置来制定结果文档打分规则,提供在针对文本 boost 打分上,支持搜索多个 schema 索引字段,并针对每一个字段设置不同的 boost 权限。 在 Solr 中,文档得分是一个用来描述查询...

    bhl_rails_solr-源码.rar

    3. **Solr字段类型与Rails模型的映射**:理解如何将Rails模型的属性转换为Solr理解的字段类型,以及如何设置字段的分析器和Boost值。 4. **并发控制**:在多线程环境下,如何确保索引操作的正确性和一致性。 通过对...

    开源企业搜索引擎SOLR的 应用教程

    通过设置字段的boost属性来调整字段的权重。 - **3.6.4 Solr分词器、过滤器、分析器** Solr提供了丰富的分词器、过滤器和分析器,可以根据需求选择合适的组合。 - **3.6.5 Solr高亮使用** 使用Solr的高亮功能...

    Apache Solr [Apache Con 2006]

    ### Apache Solr: A Comprehensive Overview #### History and Background Apache Solr has an interesting history that began with the search for a replacement search platform. Initially, the available ...

    SolrQueryComponent:轻松构建Solr查询

    SolrQueryComponent 轻松构建Solr查询 ...echo $ eb -> field ( 'name' , $ eb -> boost ( $ eb -> eq ( 'John Doe' ), 100 )); 与查询字符串对象相同: <?php use InterNations \ Component \ Solr \ Query \

    python 动态迁移solr数据过程解析

    params = {"boost": 1.0, "overwrite": "true", "&commitWithin": 1000, "commit": "true"} url = "%s/update?wt=json" % (des_url) response = requests.post(url, json=data, params=params, headers=headers) ...

    rails _sunspot 学习笔记

    在这个例子中,每个模型都指定了 `searchable` 块,并配置了 `full_name` 和 `about` 字段作为文本搜索字段,同时设置了权重(boost)。`search_class` 字段则被设置为字符串类型,用于支持分面搜索。 **视图展示**...

    JavaScript搜索引擎lunr.js.zip

    lunr.js 实现了在网页上的搜索引擎,类似 Solr。 示例代码: //定义索引 var idx = lunr(function () { this.field('title', { boost: 10 }) this.field('body') }) //添加索引 var doc = { "title": ...

    java面试时常问的电商问题

    - **优化策略**: 通过设置boost值调整索引字段的重要性,从而影响搜索结果的排序,使更相关的结果排在前面。 #### 十四、ActiveMQ在项目中的应用 - **应用场景**: 在商品添加或修改时,使用ActiveMQ发送消息通知...

    一步一步跟我学习Lucene源码之lucene的各种Field

    9. **Field Boosting**:可以通过设置Field的boost值来影响某个Field在搜索结果中的权重,提升某些Field的影响力。 10. **动态Field**:在处理动态结构的数据时,可以通过动态Field模式,以Field名的某种模式来处理...

    Lucene-WEB-search-program.zip_lucene java web_lucene web_lucene

    1. **设置环境**:首先,你需要在你的开发环境中安装Java和Apache Maven(或者Gradle),并配置好Lucene的相关依赖库。 2. **索引创建**:使用Lucene的API,我们可以读取网页内容并创建索引。这通常涉及到以下几个...

    manual 技术手册

    - Apache Solr或Search API模块可提供更高级的全文搜索和索引功能。 9. **国际化与多语言**: - Drupal 6支持多语言站点,使用i18n模块实现。 - 内容、菜单、字段和用户界面都可以翻译。 - 掌握如何配置多语言...

    lucene相关技术

    4. **Boosting**:通过设置Field的boost值,提高某些文档的得分,使其在搜索结果中排名更靠前。 5. **近似搜索**:通过编辑距离、余弦相似度等算法实现近似匹配。 6. **多线程索引**:对于大量数据,可以利用多...

    lucene in Action

    书中会介绍如何编写查询表达式,理解查询树的构造和执行过程,并且学习如何使用Boost函数对不同字段或查询项进行加权,以实现更精准的搜索结果排序。此外,还会讨论相关性评分算法,如TF-IDF,以及如何自定义评分...

    python django使用haystack:全文检索的框架(实例讲解)

    Haystack 提供了一个统一的 API 接口来处理全文检索任务,并支持多种搜索引擎如 Whoosh、Elasticsearch 和 Solr 等。 #### 二、准备工作 在正式开始使用 Haystack 之前,需要确保以下依赖已经安装完成: 1. **...

Global site tag (gtag.js) - Google Analytics