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. LeetCode(38)-Valid Sudoku

    题目: Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could ...

  2. Java数据结构面试题,输出 最后一个 出现次数为1的字符

    今天去面试,遇到一个数据结构题,给定一个字符串,输出 最后一个 出现次数为1的字符 回来研究了下,代码如下: package com.pine.interview.test; import java. ...

  3. FileReader对象异步获取外部文件的内容

    1.在网页表单中,定义input的type为file,就可以打开存储在计算机上的文件. <!DOCTYPE html> <head> <meta charset=&quo ...

  4. Python_PyMySQL数据库操作

    连接数据库: conn=pymysql.connect(host=,user=',charset='utf8') 建立游标: cur = conn.cursor() 创建一个名字叫 lj 的数据库: ...

  5. Python_让人脑阔疼的编码问题(转)+(整理)

    我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各种编码,比如作为中国程序经常要面对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢? 首 ...

  6. 基于Django的独立运行脚本开发

    1.在Django框架下工作时间长了,会对Django的技术设施产生依赖,比如其方便的ORM,如果写基于Django的独立运行脚本,主要在脚本前面加上以下代码: import sys,os,djang ...

  7. for循环之后的return

    <C++primer>第五版中文版,201页: 在含有return语句的循环后面应该也有一条return语句,如果没有的话该程序就是错误的. 前几天编写一个函数,for循环查找某个值,找到 ...

  8. prometheus alert rules文件格式化

    1.下载go(version>1.9,否则promtool工具不好使) https://golang.org/doc/install?download=go1.10.2.linux-amd64. ...

  9. Spark Streaming入门

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文将帮助您使用基于HBase的Apache Spark Streaming.Spark Streaming是Spark API核心的一个扩 ...

  10. Oracle聚合函数

    max(),min(),avg(),sum() 其中 avg(),sum()只能操作数字  , max(),min()能操作数字.日期.字母 等.