上一篇:WEBUS2.0 In Action - 索引操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(2)

1. IQueriable中内置的搜索功能

在Webus.Index.IQueriable中内置了一些基本的搜索功能:

    public interface IQueriable
{
Document SelectDoc(); //获取第一个Document对象, 作为样本
List<Document> SelectDoc(int[] docIds); //根据docId获取Document
List<IndexDocInfo> SelectIndex(string fieldname, string keyword, int length); //在指定字段中根据关键词搜索, 只返回指定长度的数据
List<string> SelectPostfixKeyword(string postfix); //搜索满足后缀条件的关键词
List<string> SelectPrefixKeyword(string prefix); //搜索满足前缀条件的关键词
List<string> SelectRegexKeyword(string pattern, RegexOptions options); //搜索满足正则表达式的关键词
List<string> SelectWildcardKeyword(string wildcard); //搜索满足通配符的关键词
List<SequenceDocInfo> SelectSequence(string fieldname, object min, object max, bool asc, int length); //在指定字段中做范围搜索, 支持排序, 只返回指定长度的数据
List<SequenceDocInfo> SelectSequence(string fieldname, params int[] docIds); //在指定字段中根据docId来获取数据
List<string> GetKeywords(); //获取全部关键词
}

IQueryiable.SelectDoc() - 有时候用户需要知道索引中Document的结构, 从而可以对索引选项进行调整. 本方法就能够将索引列表中的第一个Document对象返回给调用方.

IQueriable.SelectDoc(int[] docIds) - 根据传入的docId列表来检索对应的Document列表.

IQueriable.SelectIndex(string fieldname, string keyword, int length) - 在字段fieldname中搜索关键词keyword, 并且只返回前length个结果. 这是Indexer的核心方法之一, 它的作用是在索引中检索数据. 这里特别要注意的是length这个参数, 其默认值是int.MaxValue, 但是WEBUS2.0 SDK对性能进行了深度优化, 在检索的时候只会扫描必需的索引文件: 假设最终生成的索引文件有3个片段, 我们对keyword进行搜索, 指定length=10. 在第一个片段index1中找到了6条结果, 在第二个片段index2中又找到了4条结果, 那么程序将跳过第三个片段index3直接返回, 从而节约系统开销. 因此在实际使用时合理的设置length, 是能够明显提升性能的.

IQueriable.SelectSequence(string fieldname, object min, object max, bool asc, int length) - 在WEBUS2.0中, 如果一个字段的属性被设置为FieldAttribute.Sort, 则意味着在编制索引的时候会为其生成序列 (Sequence). 比如Document结构如下:

Name : string : FieldAttribute.AnalyseIndex

Age : double : FieldAttribute.Sort

那么所有的Age字段将会被插入到一个排序表中, 也就是所谓序列. 通过SelectSequence方法, 我们就可以对这个序列进行检索, 从而实现范围查询.

p.s. 个人窃以为这是WEBUS2.0 SDK优于Lucene的一个功能点, 在Lucene中, 如果要实现同样的范围查询, 只能够用多次全文搜索来模拟, 比如查询 10 <= Age < 20的结果, 就需要模拟10个对Age的搜索, 分别是Age=10, Age=11, ... Age=19. 而如果Age=15.5, 虽然是落在这个范围内, 但是用这种模拟的方式是无论如何也检索不到的. 因此孰优孰劣, 一比便知.

IQueriable.SelectPost/Pre/Regex/WildcardKeyword(...) - 这4个方法是WEBUS2.0中的另一个亮点, 也是非常有意思的检索方法. WEBUS2.0在编制索引的时候, 同时对关键词本身也编制了索引. 这种增强的索引策略可以为我们带来多种多样的检索乐趣. 比如在前面代码搜索器的例子中, 我们要搜索以"Client"结尾的结果集. 这个时候就是利用上PostfixKeyword的功能来实现的: 首先搜索所有以"Client"结尾的关键词列表, 然后对每个关键词分别进行搜索, 最后将结果合并起来返回到调用端.

利用这些基本方法, 就能够满足简单的搜索要求. 但是对于大部分应用, 我们一定会有更加复杂的应用需求, 这个时候就需要用到Webus.Search.Query和Webus.Search.ISearcher. 它们的功能非常强大, 能够满足各种全文搜索需求. 我将在后文中详细介绍.

相关信息及WEBUS2.0 SDK下载:继续我的代码,分享我的快乐 - WEBUS2.0

WEBUS2.0 In Action - 搜索操作指南 - (1)的更多相关文章

  1. WEBUS2.0 In Action - 搜索操作指南 - (2)

    上一篇:WEBUS2.0 In Action - 搜索操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(3) 2. 使用Query Query是所有查询的基类, 它一 ...

  2. WEBUS2.0 In Action - 搜索操作指南 - (3)

    上一篇:WEBUS2.0 In Action - 搜索操作指南(2) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(4) 3. 评分机制 (Webus.Search.IHitSc ...

  3. WEBUS2.0 In Action - 搜索操作指南 - (4)

    上一篇:WEBUS2.0 In Action - 搜索操作指南(3) 6. 搜索多个索引 为了提升性能, 我们可以从多个索引同时进行搜索, Webus.Search.MultiSearcher提供了相 ...

  4. WEBUS2.0 In Action - 索引操作指南(2)

    上一篇:WEBUS2.0 In Action - 索引操作指南(1) | 下一篇:WEBUS2.0 In Action - 搜索操作指南(1) 3. 添加.删除.撤销删除和修改文档 在WEBUS中要将 ...

  5. WEBUS2.0 In Action - [源代码] - C#代码搜索器

    最近由于工作的需要, 要分析大量C#代码, 在数万个cs文件中搜索特定关键词. 这是一项非常耗时的工作, 用Notepad++要运行接近半个小时. 于是我利用WEBUS2.0 SDK创建了一个代码搜索 ...

  6. 第二篇——Struts2的Action搜索顺序

    Struts2的Action的搜索顺序: 地址:http://localhost:8080/path1/path2/student.action     1.判断package是否存在,例如:/pat ...

  7. Struts2学习三----------Action搜索顺序

    © 版权声明:本文为博主原创文章,转载请注明出处 Struts2的Action的搜索顺序 http://localhost:8080/path1/path2/student.action 1)判断pa ...

  8. Struts2.0 去掉action后缀名

    刚刚接触Struts2.0,发现默认请求都会带着后缀名:action 就如下图,url地址中会暴露login.action(请原谅struts拼写错误..) 作为一个URL简洁爱(chu)好(nv)者 ...

  9. 帝国cms7.0修改默认搜索模版中的分页[!--show.page--]

    修改默认搜索模版的分页是在e/class/connect.php下 搜索下function page1就是我们要修改的分页了 下面贴上我修改后的分页 //前台分页 function page1($nu ...

随机推荐

  1. 游戏引擎网络开发者的64做与不做(二A):协议与API

    [编者按]在这个系列之前的文章"游戏引擎网络开发者的64做与不做(一):客户端方面"中,Sergey介绍了游戏引擎添加网络支持时在客户端方面的注意点.本文,Sergey则将结合实战 ...

  2. 通过 Mesos、Docker 和 Go,使用 300 行代码创建一个分布式系统

    [摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...

  3. poj 2311

    Cutting Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2844   Accepted: 1036 Desc ...

  4. GCD初步认识

    //(1)用异步函数往并发队列中添加任务, //总结:同时开启三个子线程 - (void)test1 { //1.获得全局的并发队列 dispatch_queue_t queue = dispatch ...

  5. PHP开发入行真功夫 三扬科技

    前言与目录 PHP开发入行真功夫 前言 PHP开发入行真功夫 目录   第2章 基本语法 2.1.1 判断闰年程序 2.1.2 我们现在能做的…… 2.2.1 PHP的语言概貌 2.2.2 为我们的程 ...

  6. POJ 3304 Segments (直线与线段是否相交)

    题目链接 题意 : 能否找出一条直线使得所有给定的线段在该直线上的投影有一个公共点. 思路 : 假设存在一条直线a使得所有线段在该直线上的投影有公共点,则必存在一条垂直于直线a的直线b,直线b与所有线 ...

  7. 机器学习之逻辑回归(Logistic Regression)

    1. Classification 这篇文章我们来讨论分类问题(classification problems),也就是说你想预测的变量 y 是一个离散的值.我们会使用逻辑回归算法来解决分类问题. 之 ...

  8. 数学+dp HDOJ 5317 RGCDQ

    题目传送门 /* 题意:给一个区间,问任意两个数的素数因子的GCD最大 数学+dp:预处理出f[i],发现f[i] <= 7,那么用dp[i][j] 记录前i个f[]个数为j的数有几个, dp[ ...

  9. C#播放声音

    [DllImport("winmm.dll")] public static extern long PlaySound(String fileName, long a, long ...

  10. 在telnet下操作memcache详解(操作命令详解)

    这篇文章主要介绍了在telnet下操作memcache详解,telnet下的memcache操作命令详解,需要的朋友可以参考下 在定位问题.测试等时候经常需要对memcache的数据进行一些操作,但是 ...