yanyiwu / gojieba

"结巴"中文分词的Golang版本
MIT License
2.43k stars 302 forks source link

提问:70M左右的网页数据,索引出的文件在1.6G是否正常? #21

Closed qiukeren closed 5 years ago

qiukeren commented 7 years ago

第一次索引完毕,吓一跳。

    1.6 GiB [##########] /tmp                                                                                                                         
   72.1 MiB [          ] /bleve

bleve目录为网页目录,tmp目录为索引目录

yanyiwu commented 7 years ago

不正常

发自我的 iPhone

在 2017年4月10日,03:09,仇柯人 notifications@github.com 写道:

第一次索引完毕,吓一跳。

1.6 GiB [##########] /tmp                                                                                                                         

72.1 MiB [ ] /bleve bleve目录为网页目录,tmp目录为索引目录

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

qiukeren commented 7 years ago

虽然不太礼貌,不过既然是不正常了,那么求看一下,gojieba库,我的调用方法是不是有问题:

我换了个源,改成小说,来源是:http://www.iplaysoft.com/1326-txt-science-fiction.html, (源文件是cp936编码,手动转码成utf8) 大约1300个文件,43M。

索引完后的文件大约在900M

  899.3 MiB [##########] /gojieba.bleve                                                                                                               
   43.3 MiB [          ] /source
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "os"

    "github.com/blevesearch/bleve"
    . "github.com/qiukeren/go-utils/common"
    "github.com/yanyiwu/gojieba"
    _ "github.com/yanyiwu/gojieba/bleve"
)

func Example() {
    INDEX_DIR := "gojieba.bleve"
    dirEntries, err := ioutil.ReadDir("/Users/XXX/gopath/src/search/bleve/source")
    if err != nil {
        log.Panicln(err)
    }
    type Message struct {
        Id      string
        Content string
    }

    indexMapping := bleve.NewIndexMapping()
    os.RemoveAll(INDEX_DIR)
    // clean index when example finished
    // defer os.RemoveAll(INDEX_DIR)

    err = indexMapping.AddCustomTokenizer("gojieba",
        map[string]interface{}{
            "dictpath":     gojieba.DICT_PATH,
            "hmmpath":      gojieba.HMM_PATH,
            "userdictpath": gojieba.USER_DICT_PATH,
            "type":         "gojieba",
            "idf":          gojieba.IDF_PATH, //idf 与stop_words必须要加,不然报错,此处采用自带的idf
            "stop_words":   gojieba.STOP_WORDS_PATH,
        },
    )
    if err != nil {
        panic(err)
    }
    err = indexMapping.AddCustomAnalyzer("gojieba",
        map[string]interface{}{
            "type":      "gojieba",
            "tokenizer": "gojieba",
        },
    )
    if err != nil {
        panic(err)
    }
    indexMapping.DefaultAnalyzer = "gojieba"

    index, err := bleve.New(INDEX_DIR, indexMapping)
    if err != nil {
        panic(err)
    }
    log.Println(len(dirEntries))
    for k, v := range dirEntries {
        log.Println(k, "of", len(dirEntries))

        data, _ := ReadToString("/Users/XXX/gopath/src/search/bleve/source/" + v.Name())
        message := Message{Id: v.Name(), Content: string(data)}

        // go func(name string, content Message) {
        index.Index(v.Name(), message)
        // }(v.Name(), message)

    }

    querys := []string{
        "你好世界",
        "亲口交代",
    }

    for _, q := range querys {
        req := bleve.NewSearchRequest(bleve.NewQueryStringQuery(q))
        req.Highlight = bleve.NewHighlight()
        res, err := index.Search(req)
        if err != nil {
            panic(err)
        }
        fmt.Println(res)
    }
}

func main() {
    Example()
}
taobil commented 7 years ago

sphinx挺好的

qiukeren commented 7 years ago

@wenduniang

我自己选型的规则是,Go>java>php>python>C/C++。

单单就搜索方面的选型是,Go>java>python>c/c++/php。

java尚且还有elk、lucene等一系列框架可以选,我没必要再舍近求远了。

taobil commented 7 years ago

解决了吗

qiukeren commented 7 years ago

并没有