package types

import (
    "log"
    "runtime"
)

var (
    // EngineInitOptions的默认值
    defaultNumSegmenterThreads       = runtime.NumCPU()
    defaultNumShards                 = 2
    defaultIndexerBufferLength       = runtime.NumCPU()
    defaultNumIndexerThreadsPerShard = runtime.NumCPU()
    defaultRankerBufferLength        = runtime.NumCPU()
    defaultNumRankerThreadsPerShard  = runtime.NumCPU()
    defaultDefaultRankOptions        = RankOptions{
        ScoringCriteria: RankByBM25{},
    }
    defaultIndexerInitOptions = IndexerInitOptions{
        IndexType:      FrequenciesIndex,
        BM25Parameters: &defaultBM25Parameters,
    }
    defaultBM25Parameters = BM25Parameters{
        K1: 2.0,
        B:  0.75,
    }
    defaultPersistentStorageShards = 8
)

type EngineInitOptions struct {
    // 是否使用分词器
    // 默认使用,否则在启动阶段跳过SegmenterDictionaries和StopTokenFile设置
    // 如果你不需要在引擎内分词,可以将这个选项设为true
    // 注意,如果你不用分词器,那么在调用IndexDocument时DocumentIndexData中的Content会被忽略
    NotUsingSegmenter bool

    // 半角逗号分隔的字典文件,具体用法见
    // sego.Segmenter.LoadDictionary函数的注释
    SegmenterDictionaries string

    // 停用词文件
    StopTokenFile string

    // 分词器线程数
    NumSegmenterThreads int

    // 索引器和排序器的shard数目
    // 被检索/排序的文档会被均匀分配到各个shard中
    NumShards int

    // 索引器的信道缓冲长度
    IndexerBufferLength int

    // 索引器每个shard分配的线程数
    NumIndexerThreadsPerShard int

    // 排序器的信道缓冲长度
    RankerBufferLength int

    // 排序器每个shard分配的线程数
    NumRankerThreadsPerShard int

    // 索引器初始化选项
    IndexerInitOptions *IndexerInitOptions

    // 默认的搜索选项
    DefaultRankOptions *RankOptions

    // 是否使用持久数据库,以及数据库文件保存的目录和裂分数目
    UsePersistentStorage    bool
    PersistentStorageFolder string
    PersistentStorageShards int
}

// 初始化EngineInitOptions,当用户未设定某个选项的值时用默认值取代
func (options *EngineInitOptions) Init() {
    if !options.NotUsingSegmenter {
        if options.SegmenterDictionaries == "" {
            log.Fatal("字典文件不能为空")
        }
    }

    if options.NumSegmenterThreads == 0 {
        options.NumSegmenterThreads = defaultNumSegmenterThreads
    }

    if options.NumShards == 0 {
        options.NumShards = defaultNumShards
    }

    if options.IndexerBufferLength == 0 {
        options.IndexerBufferLength = defaultIndexerBufferLength
    }

    if options.NumIndexerThreadsPerShard == 0 {
        options.NumIndexerThreadsPerShard = defaultNumIndexerThreadsPerShard
    }

    if options.RankerBufferLength == 0 {
        options.RankerBufferLength = defaultRankerBufferLength
    }

    if options.NumRankerThreadsPerShard == 0 {
        options.NumRankerThreadsPerShard = defaultNumRankerThreadsPerShard
    }

    if options.IndexerInitOptions == nil {
        options.IndexerInitOptions = &defaultIndexerInitOptions
    }

    if options.IndexerInitOptions.BM25Parameters == nil {
        options.IndexerInitOptions.BM25Parameters = &defaultBM25Parameters
    }

    if options.DefaultRankOptions == nil {
        options.DefaultRankOptions = &defaultDefaultRankOptions
    }

    if options.DefaultRankOptions.ScoringCriteria == nil {
        options.DefaultRankOptions.ScoringCriteria = defaultDefaultRankOptions.ScoringCriteria
    }

    if options.PersistentStorageShards == 0 {
        options.PersistentStorageShards = defaultPersistentStorageShards
    }
}

engine_init_options.go的更多相关文章

  1. index_init_oprions.go

    {         options.DocCacheSize = defaultDocCacheSize     } }

随机推荐

  1. IT轮子系列(三)——如何给返回类型添加注释——Swagger的使用(二)

    前言 一般对外提供API,都会统一一个返回类型,比如所有的接口都统一返回HttpResponseMessage.这样当我们在方法上添加///注释时,是无法清楚的知道都返回字段都又那些以及它们的数据类型 ...

  2. Centos 7 卸载自带的openjdk

    [root@localhost ~]# rpm -qa|grep jdk java-1.6.0-openjdk-1.6.0.0-1.50.1.11.5.el6_3.x86_64 java-1.7.0- ...

  3. DBC的故事

    1.DBC定义 DBC(data base CAN)是汽车ECU间进行CAN通讯的报文内容,有了它相互之间才能听懂. 2.DBC查看 DBC是文本文件,可以用记事本打开,一般都用CANdb++,可以更 ...

  4. 【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象

    不完整的抽象 抽象未支持所有互补或相关的方法时,将导致这种坏味. 为什么要有完整的抽象? 一种重要的抽象实现手法是创建内聚而完整的抽象.抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性.如果抽象 ...

  5. JAVA基础经典面试

    [前言] 整理好久,这篇总结写的超级好,很全面.要全部背下来,至于框架应用那块,一定要有针对的,多写项目,照着慕课的对应项目. 链接:http://www.importnew.com/22083.ht ...

  6. C++内存分区

    C++的内存划分为栈区.堆区.全局区/静态区.字符串常量和代码区. 这里去掉自由存储区,增加了代码区,理由会在下面讲到. 栈区:由系统进行内存的管理. 说明:主要存放函数的参数以及局部变量.栈区由系统 ...

  7. neo4j-rest-client使用摘要

    1.使用它的原因,与django搭配的最好的neomodel目前只支持到v2.2,我已给官方发了issue,官方也回复了,马上修改并发布(老外对开源项目的负责态度让人感动) 2.这个库的文档中大概描述 ...

  8. 手把手教你全家桶之React(二)

    前言 上一篇已经讲了一些react的基本配置,本遍接着讲热更新以及react+redux的配置与使用. 热更新 我们在实际开发时,都有用到热更新,在修改代码后,不用每次都重启服务,而是自动更新.并而不 ...

  9. angular.js学习的第一天

    第一天对angular.js进行学习,肯定是面对的入门的最简单的实例: 实现下面的这个效果,首先需要在html页面引入angular.js,在下面的div中,ng-app则表示在当前div是一个ang ...

  10. 跨域cors方法(jsonp,document.domain,document.name)及iframe性质

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...