前提:不对结果做sort操作.
在搜索中,并不是所有的Document和Fields都是平等的.有些技术会要求到对其Doucment或者Fields的权值改变,[b]默认值为:1.0F[b],以上需求都是通过改变Document的boost因子来改变的.
setBoost(float)
@Test
public void testFieldBoost() throws Exception{
String[] email = {"bc_bc@gmail.com","ab_bc@gmail.com","ab_bc_cd@gmail.com"};
RAMDirectory rd = new RAMDirectory();
Analyzer analyzer = new SimpleAnalyzer();//Version.LUCENE_CURRENT);
IndexWriter iw = new IndexWriter(rd,analyzer,MaxFieldLength.UNLIMITED);
for (int i = 0; i < email.length; i++) {
Document doc = new Document();
//-----------代码段 一---------------------
/* if(i == 1)
doc.setBoost(2F);//default
//改变不同的权值
if(i == 0)
;//doc.setBoost(0.5F);
if(i == 1)
;//doc.setBoost(0.1F);//default
if(i == 2)
doc.setBoost(1.2F);
*/
//-----------代码段 一 结束--------------------
doc.add(new Field("email", email[i], Field.Store.YES,Field.Index.ANALYZED));
//可选,查看分词情况
/*TokenStream ts = analyzer.tokenStream("email", new StringReader(email[i]));
ts.addAttribute(TermAttribute.class);
while (ts.incrementToken()) {
TermAttribute ta = ts.getAttribute(TermAttribute.class);
System.out.println("{"+ta.term()+"}");
}
iw.optimize();*/
iw.addDocument(doc);
}
iw.close();
IndexSearcher is = new IndexSearcher(rd);
Term t = new Term("email", "bc");
Query query = new TermQuery(t);
query.setBoost(2F);
TopDocs td = is.search(query, 100);
for (int i = 0; i < td.scoreDocs.length; i++) {
System.out.println(is.doc(i).get("email"));
System.out.println(is.explain(query, i));
}
is.close();
}
Result:
bc_bc@gmail.com
0.5036848 = (MATCH) fieldWeight(email:bc in 0), product of:
1.4142135 = tf(termFreq(email:bc)=2)
0.71231794 = idf(docFreq=3, maxDocs=3)
0.5 = fieldNorm(field=email, doc=0)
ab_bc@gmail.com
0.35615897 = (MATCH) fieldWeight(email:bc in 1), product of:
1.0 = tf(termFreq(email:bc)=1)
0.71231794 = idf(docFreq=3, maxDocs=3)
0.5 = fieldNorm(field=email, doc=1)
ab_bc_cd@gmail.com
0.3116391 = (MATCH) fieldWeight(email:bc in 2), product of:
1.0 = tf(termFreq(email:bc)=1)
0.71231794 = idf(docFreq=3, maxDocs=3)
0.4375 = fieldNorm(field=email, doc=2)
结果查看:
因为bc查询出来两次,所以第一条的tf=2的开方,即为1.4142135,第二三个结果集为一个,则tf=1,默认的boost为1.0;由于来自于同一个文档,idf相同;bc_bc与ab_bc的长度相同,所以fieldNorm的值一样.
代码清单二
//-----------代码段 一---------------------
/*
if(i == 1)
doc.setBoost(2F);//default
//改变不同的权值
if(i == 0)
;//doc.setBoost(0.5F);
if(i == 1)
;//doc.setBoost(0.1F);//default
if(i == 2)
doc.setBoost(1.2F);
*/
//-----------代码段 一 结束--------------------
取消对着代码的注释.就改变了boost的权值,结果中的fieldNorm值就为原fieldNorm*设置的权值.
Result:
bc_bc@gmail.com
1.0073696 = (MATCH) fieldWeight(email:bc in 0), product of:
1.4142135 = tf(termFreq(email:bc)=2)
0.71231794 = idf(docFreq=3, maxDocs=3)
1.0 = fieldNorm(field=email, doc=0)
ab_bc@gmail.com
0.35615897 = (MATCH) fieldWeight(email:bc in 1), product of:
1.0 = tf(termFreq(email:bc)=1)
0.71231794 = idf(docFreq=3, maxDocs=3)
0.5 = fieldNorm(field=email, doc=1)
ab_bc_cd@gmail.com
0.35615897 = (MATCH) fieldWeight(email:bc in 2), product of:
1.0 = tf(termFreq(email:bc)=1)
0.71231794 = idf(docFreq=3, maxDocs=3)
0.5 = fieldNorm(field=email, doc=2)
最后附上,计算公式:
TermQuery的计算公式
score = sqrt(freq) * idf * boost * norm
idf = ln(maxDoc/(docFreq + 1) )+ 1.0
norm = fieldboost / sqrt(fieldlength)
参考PPT
1.
查看
分享到:
相关推荐
1. **文档权重(Document Boost)**:在Lucene中,可以通过`Document.SetBoost(float boost)`方法为文档设置权重。默认情况下,Lucene会根据文档的得分(score)进行排序,得分越高,文档在结果列表中的位置越靠前。...
此外,Lucene还允许通过QueryParser设置查询级别的评分策略,比如使用`boost`关键字来提高某些查询词的权重。 总的来说,理解并掌握Lucene的评分公式对于优化搜索结果的质量至关重要。通过对评分公式的深入研究和...
9. **Field Boosting**:可以通过设置Field的boost值来影响某个Field在搜索结果中的权重,提升某些Field的影响力。 10. **动态Field**:在处理动态结构的数据时,可以通过动态Field模式,以Field名的某种模式来处理...
5. **Query Boosting**:查询中可以给每个查询词项分配权重,这样匹配到高权重词项的文档将得到更高的评分。 6. **Document Boosting**:在索引文档时,可以指定一个boost值,提高或降低整个文档的评分。 为了更好...
Boost则可以调整某些字段或查询项的权重,影响相关性评分。 - **内存索引与磁盘索引**:根据应用需求,可以选择将索引保留在内存中或磁盘上。内存索引速度更快,但占用资源多;磁盘索引则节省资源,但查询速度稍慢。...
- **增加查询词权重(Boost)**:提高某些查询词的重要性。 - **布尔操作符**:逻辑运算符,如 AND、OR、NOT。 - **组合**:多种查询方式的结合使用。 #### JavaCC 在 Lucene 中的应用 JavaCC 是一种强大的编译器...
Boost值可以在文档级别或字段级别设置,以影响文档的排名。文档Boosting乘以Field-Boosting来计算最终的加权值,如果未特别设置,通常为1。 总的来说,Lucene的结果排序是一个综合各种因素的复杂过程,旨在提供最...
Lucene的核心功能是索引和搜索,其设计目标是让开发者可以快速地在大量文档中实现高效的全文检索。2.2.0版本在当时已经具备了成熟的索引结构和搜索算法,包括倒排索引、TF-IDF权重计算等。通过分析源代码,我们可以...
Lucene 的得分计算公式考虑了多个因素,包括文档权重、域权重、调整因子、逆文档频率等。文档权重是指在索引时给某个文档设置的权重值;域权重是指在查询的时候给某个域设置的权重值;调整因子是基于文档中包含查询...
此外,还可以使用`Boost`来提高特定字段或查询的权重。 7. **扩展搜索**:Lucene允许开发者通过实现自己的过滤器、比较器和评分模型等进行扩展,以满足特定需求。例如,可以自定义`Similarity`类来调整结果的评分...
查询操作是数据检索的关键,文档中提到了基础查询(包括查询所有和条件查询),以及高级条件查询,如权重boost查询和过滤coerce查询。此外,还有copy_to功能,它能够将多个字段的值合并到一个字段中,并且可以对doc_...
"boost"属性用于设置字段的权重,影响搜索结果的相关性。 插入数据时,我们使用POST请求将文档添加到指定的索引和类型下。在示例中,制造了几条包含"内容"、"标题"、"发布日期"、"作者"和"类别"字段的文档。 检索...
`boost`属性表示该文档的重要性权重。 #### 四、总结 通过对Solr创建索引的过程的深入了解,我们可以更好地掌握其工作原理和实现细节。在实际应用中,理解这些机制有助于优化索引性能、减少错误并提高查询效率。...
词袋模型忽略了词序和语法结构,只关注词汇出现的频率,而TF-IDF则通过考虑一个词在整个文档集合中的普遍性,赋予更重要的权重给那些在特定文档中频繁出现但在整个文集里不常见的词。 计算相似度时,我们可以采用...
7. @Boost:用于设置字段的权重,影响搜索结果的相关性排序。 三、关联关系 在 Compass 中,关联关系指的是对象间的引用。例如,一个订单可能包含多个产品,这种情况下,我们需要定义如何将订单对象和产品对象关联...
- **增加查询权重**:通过 `boost` 属性提高查询结果的相关性。 ```shell GET /library/_search?pretty -d ' { "query": { "term": { "title": { "value": "crime", "boost": 10 } } } } ``` - **...
当新的文档添加到索引中时,Solr会对其进行分析、提取关键词并存储这些信息。索引过程可以通过API调用或批量导入等方式完成。 - **1.3.2 搜索** 用户通过HTTP请求发送查询,Solr根据查询条件在索引中查找匹配的...