WEBUS2.0 In Action - 搜索操作指南 - (3)
上一篇:WEBUS2.0 In Action - 搜索操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(4)
3. 评分机制 (Webus.Search.IHitScorer)
IndexSearcher在完成搜索之后会利用Webus.Search.IHitScorer来对结果进行评分.
namespace Webus.Search
{
public interface IHitsScorer
{
void Score(Hits hits, Query query);
}
}
在进行评分时, 我们主要参考结果集hits, 同时也要参考用于搜索的query对象, 从而可以根据用户的原始查询需求来设定每个结果的权重.
IHitScorer.Score方法由IndexSearcher自动调用, 分数信息将保存在HitDoc.Score字段中:
public class HitDoc
{
//...
public float Score { get; set; }
//...
}
WEBUS2.0 SDK包含一个默认评分器: Webus.Search.DefaultScorer, 它对一个结果进行两次评分, 第一次根据基本属性评分, 规则如下:
分数1 = Log10(文档关键词匹配个数 + ) * query权重 (query.Boost) * 文档权重 (doc.Boost)
然后它会进行第二次评分, 这次主要考量关键词的前后相关性:
分数2 =
foreach(var hit in hits)
{
foreach(var pos in hit.Positions)
{
如果前后挨着的两个匹配 (pos) 满足如下条件, 则加分:
a. 分别来自于两个不同的子查询
b. 在文档位置上彼此前后相连
}
}
最后的分数 = 分数1 + 分数2.
这套规则综合考量了索引和搜索过程中所有的重要变量:
. 文档权重 - Document.Boost
. 查询权重 - Query.Boost
. 匹配数目的多寡 - Log10(hit.Positions.Count)
. 匹配的相关性
因此能够较好的反应结果相关性, 是比较理想的评分器. 当然, 在实际运用中, 我们随时可以创造自己的个性化评分器, 只要实现IHitScorer接口即可.
4. 排序 (Webus.Search.IHitSorter)
排序发生在评分之后. IndexSearcher利用IHitSorter来完成排序操作:
namespace Webus.Search
{
public interface IHitsSorter : IComparer<HitDoc>
{
void Sort(Hits hits);
}
}
排序只需传入结果集hits即可. WEBUS2.0 SDK中内置了多种排序器:
DocIdSorter - 根据DocId的大小进行升序或降序排序. 通常我们也用这个排序器来实现对时间排序. 因为一般情况下, DocId大的文档时间靠后, DocId小的文档时间靠前.
public DocIdSorter(bool ascending) { ... }
FieldSorter - 根据指定Field的值进行升序或降序排序. 注意这个排序器会遍历结果集中指定Field的值, 因此当数据量非常大时会存在一定的性能瓶颈.
public FieldSorter(string fieldname, bool ascending, ISearcher searcher) {...}
ScoreSorter - 顾名思义, 根据评分来排序, 同样也支持升序和降序两种方式
public ScoreSorter(bool ascending) {...}
5. 过滤器 (Webus.Search.IHitFiler)
过滤发生在排序之后, 由过滤器 IHitFilter 来完成.
namespace Webus.Search
{
public interface IHitsFilter
{
void Filter(Hits hits);
}
}
过滤器的职责非常明确, 就是裁剪结果集大小. 这个处理步骤虽然最后发生, 其实非常实用. 比如结果分页, 比如去重都靠它来实现. 在WEBUS2.0 SDK中, 包含了如下过滤器:
PageFilter - 分页过滤器
//index - 起始记录位置
//count - 要显示的记录条数
public PageFilter(int index, int count) {...}
UniqueFilter - 去重过滤器
//fieldName - 将根据指定的字段的值来去重
public UniqueFilter(string fieldName) {...}
FieldFilter - 字段过滤器
public FieldFilter(string fieldname, object minValue, object maxValue) {...}
指定字段的最大值, 最小值进行过滤. 注意, 此过滤器同样也需要遍历结果集中指定字段的值, 因此在结果数目巨大的情况下会存在性能问题.
小结
WEBUS的搜索过程遵循着这样一条线进行:
分析查询对象Query, 生成子查询 -> 读取索引, 执行子查询 -> 合并结果集 -> 评分 -> 排序 -> 过滤 -> 返回结果
SDK的灵活之处就在于每个环节都提供了接口, 能够进行二次开发. 当然, 一般情况下我们只需要对评分及其之后的步骤进行二次开发即可满足大部分应用需求, 估计绝少有人会劳神费力的去开发前面的步骤 :). 虽然我们的实现可能不是最优化, 但是一定具备很强的普适性, 这也是WEBUS2.0的价值所在. 我衷心的希望有人能够利用WEBUS2.0 SDK来解决问题, 这也是对我们努力的宝贵肯定!
相关信息及WEBUS2.0 SDK下载:继续我的代码,分享我的快乐 - WEBUS2.0
访问我们的站点: www.gdtsearch.com
WEBUS2.0 In Action - 搜索操作指南 - (3)的更多相关文章
- WEBUS2.0 In Action - 搜索操作指南 - (1)
上一篇:WEBUS2.0 In Action - 索引操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(2) 1. IQueriable中内置的搜索功能 在Webus ...
- WEBUS2.0 In Action - 搜索操作指南 - (2)
上一篇:WEBUS2.0 In Action - 搜索操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(3) 2. 使用Query Query是所有查询的基类, 它一 ...
- WEBUS2.0 In Action - 搜索操作指南 - (4)
上一篇:WEBUS2.0 In Action - 搜索操作指南(3) 6. 搜索多个索引 为了提升性能, 我们可以从多个索引同时进行搜索, Webus.Search.MultiSearcher提供了相 ...
- WEBUS2.0 In Action - 索引操作指南(2)
上一篇:WEBUS2.0 In Action - 索引操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(1) 3. 添加.删除.撤销删除和修改文档 在WEBUS中要将 ...
- WEBUS2.0 In Action - [源代码] - C#代码搜索器
最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++要运行接近半个小时. 于是我利用WEBUS2.0 SDK创建了一个代码搜索 ...
- 第二篇——Struts2的Action搜索顺序
Struts2的Action的搜索顺序: 地址:http://localhost:8080/path1/path2/student.action 1.判断package是否存在,例如:/pat ...
- Struts2学习三----------Action搜索顺序
© 版权声明:本文为博主原创文章,转载请注明出处 Struts2的Action的搜索顺序 http://localhost:8080/path1/path2/student.action 1)判断pa ...
- Struts2.0 去掉action后缀名
刚刚接触Struts2.0,发现默认请求都会带着后缀名:action 就如下图,url地址中会暴露login.action(请原谅struts拼写错误..) 作为一个URL简洁爱(chu)好(nv)者 ...
- 帝国cms7.0修改默认搜索模版中的分页[!--show.page--]
修改默认搜索模版的分页是在e/class/connect.php下 搜索下function page1就是我们要修改的分页了 下面贴上我修改后的分页 //前台分页 function page1($nu ...
随机推荐
- Grid行编辑插件
//操作列不显示应该就是autoLoad的问题. Ext.onReady(function () { Ext.BLANK_IMAGE_URL = "E ...
- 解决JS文件页面加载时的阻塞
关于页面加载时的时间消费,许多书中都做出了介绍,也提出了很多种方法.本文章就详细介绍XHR注入. 概述:JS分拆的方法 1.XHR注入:就是用ajax异步请求同域包含脚本的文件,然后将返回的字符串转化 ...
- 设计模式之Builder模式
一.感性认识 二.Builder模式 1.定义 一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.即构建过程相同,但是子部件却不相同. 2.结构说明 Builder: 创建者接口 ...
- HDU 4496 D-City(并查集,逆思维)
题目 熟能生巧...常做这类题,就不会忘记他的思路了... //可以反过来用并查集,还是逐个加边,但是反过来输出...我是白痴.....又没想到 //G++能过,C++却wa,这个也好奇怪呀... # ...
- HDU 1316 How Many Fibs?(java,简单题,大数)
题目 /** * compareTo:根据该数值是小于.等于.或大于 val 返回 -1.0 或 1: public int compareTo(BigInteger val) 将此 BigInteg ...
- DevExpress TreeList 那些事儿
1:TreeList绑定数据源 当我们给予TreeList 的 parentFieldName 和 KeyFieldName 两个属性之后 会自动的生成树结构. 1 var sql = @" ...
- 使用var声明的变量 和 直接赋值并未声明的变量的区别
在看JS高级程序设计时忽然想到这个问题,众所周知,直接赋值一个变量而为声明,会产生一个全局变量(或者说是全局对象的属性),但用var声明的变量 和 直接赋值而并未声明的变量 都有哪些区别呢,这是我在百 ...
- OpenSSL 使用 base64 编码/解码
简述 关于 OpenSSL 的介绍及安装请参见:Windows下编译OpenSSL 下面主要介绍有关 OpenSSL 使用 base64 编码/解码. 简述 编码解码 更多参考 编码/解码 #incl ...
- MAVEN ERROR: unable to find valid certification path to requested target 解决办法
第一次使用MAVEN编译项目,出现如下错误 解决办法:Maven的setting.xml中添加如下代码 <mirrors> <mirror> <id>Central ...
- 296. Best Meeting Point
题目: A group of two or more people wants to meet and minimize the total travel distance. You are give ...