Save
Saving
  • Zero

    下载solr-7.2.0:
    wget http://archive.apache.org/dist/lucene/solr/7.2.0/solr-7.2.0.zip

    解压solr-7.2.0:
    unzip solr-7.2.0.zip
    mv solr-7.2.0 ./solr

    进入solr可执行程序目录
    cd ./solr/bin

    试运行一下看看输出什么结果:
    ./solr
    0_1532366214473_WX20180724-011613@2x.png

    启动solr服务(监听8080端口):
    ./solr start -p 8080

    检测服务是否启动成功,在浏览器中输入:
    http://localhost:8080
    或者在控制台输入:
    wget http://localhost:8080
    能够正常访问则说明启动成功了

    查看服务状态:
    ./solr status

    停止服务:
    ./solr stop


    下面说下如何在solr中创建Core:
    默认情况下创建会报错Can't find resource 'solrconfig.xml'
    假设Core的name和instanceDir都为ghost
    首先进入以下目录中:
    cd ./solr/server/solr
    再该目录下我发现了刚才我创建的目录ghost,并且还有一个将会被用到的目录configsets,这时候执行一下命令
    cp -r ./configsets/_default/conf/ ./ghost
    其中的名字更具实际情况修改,这时候在回到网页控制台创建Core即可成功

    posted in GuaiK机房 read more
  • Zero

    搜索引擎4大组件:

    • 索引管理器(Index Manager)
    • 索引检索器(Index Searcher)
    • 索引构建器(Indexer)
    • 文档管理器(Document Manager)

    全文搜索方式:

    • 全扫描进行全文搜索(grep型搜索),KMP算法和BM算法
    • 索引进行全文搜索

    倒排索引(Inverted Index)基本原理

    0_1532273332303_WechatIMG321.jpeg

    当同时查找多个单词的文档时,先从词典中找出各个单词,然后分别获取这些单词的倒排列表,计算出这些列表的交集即可得到同事包含所有单词的文档列表。


    分词

    可以将一句短语拆分成多个单词,用来构建倒排索引。

    常用的中文分词算法:词素解析分割法,N-gram(q-gram)分割法。

    各个单词在文档中出现的次数叫做TF(Term Frequency)词频,常用于计算检索结果的排名等。


    检索模型(如何进行检索)

    将布尔检索的检索模型叫做布尔模型,布尔模型使用多个单词通过逻辑运算符连接而成进行查询检索(AND,OR,NOT)。


    关联度的计算方法

    • 余弦相似度(CosineSimilarity)
    • OkapiBM25

    构建倒排索引的过程

    提取词元,从作为检索对象的文档中提取出词元及其出现的位置,对于每个词元将其所在文档的引用信息(文档编号)和出现在文档中的位置保存起来。
    利用N-gram或者词素解析的方法将句子分割成词元的序列。


    倒排索引的学习资料

    Inverted_Index.pdf

    posted in GuaiK实验室 read more
  • Zero

    首先使用include包含头文件:

    #include <iostream>
    #include <wchar.h>
    #include <locale>
    #include <codecvt>
    
    using namespace std;
    

    wstring转换成utf8编码

    /**
     * 将wstring转换成utf8编码
     * @param [in] text : 待转换的宽字符
     * @return 
     */
    string Utils::wstr2utf8(const wstring &text){
        std::wstring_convert<std::codecvt_utf8<wchar_t>>cnv;
        return cnv.to_bytes(text);
    }
    

    将utf8转换成wstring

    /**
     * 将utf8转换成wstring
     * @param  [in] text : 待转换的utf8字符串
     * @return 
     */
    wstring Utils::utf82wstr(const string &text){
        std::wstring_convert<std::codecvt_utf8<wchar_t>> cnv;
        return cnv.from_bytes(text);
    }
    

    分割UTF-8字符串

    /**
     * 分割UTF-8字符串
     * @param [in] text : 待处理的utf8字符串
     * @param [in] start : 开始位置
     * @param [in] leng : 长度
     * @return 
     */
    std::string Utils::utf8_substr(const std::string& text, uint32_t start, uint32_t leng){
        if (leng==0) { return ""; }
        uint32_t c, i, ix, q, min=string::npos, max=string::npos;
        for (q=0, i=0, ix=text.length(); i < ix; i++, q++){
            if (q==start){ min=i;}                                // 记录下截取的开始下标
            if (q<=start+leng || leng==string::npos){ max=i;}     // leng == -1 代表截取到末尾 所以每次max=i即可
            c = (unsigned char) text[i];
            if      (c<=127) i+=0;
            else if ((c & 0xE0) == 0xC0) i+=1;
            else if ((c & 0xF0) == 0xE0) i+=2;
            else if ((c & 0xF8) == 0xF0) i+=3;
            else if ((c & 0xFC) == 0xF8) i+=4;
            else if ((c & 0xFE) == 0xFC) i+=5;
            else return "";
        }
        //    printf("min:%d,max:%d,ix:%d,i:%d\n",min,max,ix,i);
        if (q<=start+leng || leng==std::string::npos){ max=i; }
        if (min==std::string::npos || max==std::string::npos) { return ""; }
        return text.substr(min,max-min);
    }
    

    获取UTF-8字符串长度

    /**
     * 获取UTF-8字符串长度
     * @param [in] text : 待处理的utf8字符串
     * @retval 长度
     */
    int Utils::utf8_strlen(const string& text){
        int c,i,ix,q;
        for (q=0, i=0, ix=text.length(); i < ix; i++, q++){
            c = (unsigned char) text[i];
            if      (c<=127) i+=0;
            else if ((c & 0xE0) == 0xC0) i+=1;
            else if ((c & 0xF0) == 0xE0) i+=2;
            else if ((c & 0xF8) == 0xF0) i+=3;
            else if ((c & 0xFC) == 0xF8) i+=4;
            else if ((c & 0xFE) == 0xFC) i+=5;
            else return 0;    
        }
        return q;
    }
    

    posted in GuaiK实验室 read more
  • Zero

    使用树莓派发出PWM信号通知电子调速器控制无刷电机的转速。目前已经可以飞行。不过在家测试把网线给切了😬

    0_1532320566153_1532147811337.jpg

    posted in GuaiK实验室 read more