zoukankan      html  css  js  c++  java
  • WEBUS2.0 In Action

    上一篇: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

  • 相关阅读:
    linux awk命令详解
    Linux 大页面使用与实现简介(转)
    二层设备与三层设备的区别--总结
    Windows下的cd命令
    linux常用命令
    上班第一天
    linux 内核移植和根文件系统的制作
    Sizeof与Strlen的区别与联系
    嵌入式软件工程师面试题
    SpringBoot简单打包部署(附工程)
  • 原文地址:https://www.cnblogs.com/iamzyf/p/3205225.html
Copyright © 2011-2022 走看看