Giter Site home page Giter Site logo

wukong's Introduction

悟空全文搜索引擎

微博搜索demo

安装/更新

go get -u -v github.com/huichen/wukong

需要Go版本至少1.1.1

使用

先看一个例子(来自examples/simplest_example.go

package main

import (
	"github.com/huichen/wukong/engine"
	"github.com/huichen/wukong/types"
	"log"
)

var (
	// searcher是协程安全的
	searcher = engine.Engine{}
)

func main() {
	// 初始化
	searcher.Init(types.EngineInitOptions{
		SegmenterDictionaries: "github.com/huichen/wukong/data/dictionary.txt"})
	defer searcher.Close()

	// 将文档加入索引,docId 从1开始
	searcher.IndexDocument(1, types.DocumentIndexData{Content: "此次百度收购将成**互联网最大并购"}, false)
	searcher.IndexDocument(2, types.DocumentIndexData{Content: "百度宣布拟全资收购91无线业务"}, false)
	searcher.IndexDocument(3, types.DocumentIndexData{Content: "百度是**最大的搜索引擎"}, false)

	// 等待索引刷新完毕
	searcher.FlushIndex()

	// 搜索输出格式见types.SearchResponse结构体
	log.Print(searcher.Search(types.SearchRequest{Text:"百度**"}))
}

是不是很简单!

然后看看一个入门教程,教你用不到200行Go代码实现一个微博搜索网站。

其它

wukong's People

Contributors

3xian avatar buchenglei avatar faberliu avatar gqf2008 avatar huichen avatar lujinda avatar merrychris avatar whtang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wukong's Issues

如何实现高词频搜索

目前项目要实现自动选择正确名称的功能,但不需要全文检索。
假如数据库中有如下数据:

深圳市百度中学
深圳市谷歌小学
深圳市实验小学
深圳市实验小学
深圳市实验小学
深圳市实验小学
深圳市实验小学
深圳市实验 小学
深圳市百度中学

根据词频挖掘:
当输入“深圳市”的时候,出现词频最高的

深圳市实验小学
深圳市百度中学

关于labels的使用

你好,我在使用时发现如果建立索引时不加labels,可以成功搜索到所有满足条件的记录,但是如果索引时加上labels,且不同文档之间有相同labels时(文档中也包含了labels关键字),搜索该label关键字会遗漏很多记录,每次必现,微博那个demo加上labler后测试也有这个情况,似乎是个bug

请教如何支持拼音搜索功能

例如应用中需要对电影进行搜索,索引了“龙门镖局”,但是希望用户搜索long、longmen、lmbj也能得到相应“龙门镖局”的结果。

我想到的方案是先得到“龙门镖局”的分词,再计算所有分词的拼音,做为labels增加到索引中。

不知道我的方案是否正确,或者有其他方案实现。

缩小 git repo 的体积

TL;DR:

同样的代码,但是 clone 的时候体积更小,可以访问 https://github.com/zhuangya/wukong.git

我会尽量保持和 upstream 同步


如同在 codelab 里写的一样,在 git 中去掉了 weibo_data.txt 来让代码在 clone 的时候体积更小,但是不错从 git 历史中把它去掉是没有太大改善的。

所以我做了一些这方面的是工作,包括:

  • 在整个 git 历史中,去掉了 weibo_data.txt
  • 在整个 git 历史中,去掉了 data/ 目录,取而代之的是将它以 submodule 的形式引入到代码库中
  • 更新了 codelab 中 weibo_data.txt 的地址。
  • 创建了一个新的用来存放这些体积很大又不会有经常改变的文件的 git repo:wukong-data

由于更改了整个 git 的历史,所以没有共同的 tree-ish parent 也就没有办法发 pull-request 了。

@huichen 如果你希望让wukong的代码库 clone 起来体积更小,可以来看一下我这边做的相关的事情 😄

相关的 links

https://help.github.com/articles/remove-sensitive-data/
http://rtyley.github.io/bfg-repo-cleaner/
https://git-lfs.github.com/

捐赠帐号描述建议

建议将...feedback.md中的"...捐赠,我的淘宝/paypal/wallet账号...",其中的“淘宝”换为“支付宝”。

紧邻距离(Token Proximity)是什么?

请教一下,这个术语,是本项目专门发明的,还是搜索引擎已有的一个概念?

我搜索“紧邻距离”或"Token Proximity",都没有找到相关解释,在 wikipedia上搜索 Token Proximity ,也没搜到,感觉这个术语是您发明的?

NumShards的大小会影响搜索结果

我觉得这个是架构设计的问题,因为不同shard之间,数据不同,多个关键词同时匹配时,只是在当前shard中查找,因此,shard数会不同,检索的结果也会不同。
那么,是不是应该把shard当中分类搜索功能呢?

编译报错。

github.com/cznic/zappy

:0: sorry, unimplemented: 64-bit mode not compiled in
FAIL github.com/cznic/zappy [build failed]

go小白求教

想让检索结果以时间降序排列,怎么做呢?

原文档的结构类似如下:
type Doc struct{
CreateTime time.Time
Content string
}
使文档的Content作为索引,最后进行搜索,如何让结果以 CreateTime时间降序排列,而不是使用Scores进行排序?
先谢了!

请问如何做range查询,类似日期范围

请问如何做range查询,主要是数字的range查询
还有关于索引的持久化,现在的索引是放在内存的,重启后就需要重建,如果文本量比较大的话,这个就比较麻烦。。

是不是还不支持Go 1.8?

我就用最简单的范例
加入这一句 searcher = engine.Engine{} ,程序虽然能build,但一运行就退出,显示 Killed: 9 ,没有更多信息。

把这句删掉就正常。

go version go1.8 darwin/amd64

关于testdata问题

感觉这么大一个文件放在git里面 把版本库撑得很大 是否考虑重新开一个项目来存放测试相关的数据呢?

timeout的bug

// 设置超时
		deadline := time.Now().Add(time.Nanosecond * time.Duration(NumNanosecondsInAMillisecond*request.Timeout))
		for shard := 0; shard < engine.initOptions.NumShards; shard++ {
			select {
			case rankerOutput := <-rankerReturnChannel:
				if !request.CountDocsOnly {
					for _, doc := range rankerOutput.docs {
						rankOutput = append(rankOutput, doc)
					}
				}
				numDocs += rankerOutput.numDocs
			case <-time.After(deadline.Sub(time.Now())):
				isTimeout = true
				break
			}
		}

如果设置了超时,而且确实是超时了,那么进入 下面那条case了,那么原来的rankerReturnChannel要返回的rankerOut就无法正常返回了,阻塞了,而且会影响下次search的结果会返回上次是结果

持久存储模式下的索引添加导致的搜索结果疑惑

索引数据量非常大,内存放不下,所以用了持久存储,而持久存储在每次添加索引后的searcher.FlushIndex()动作是全局更新磁盘上的索引数据,还是增量添加?

为何有时候添加完后,前后同样的关键词,前一次搜索有结果,后一次搜索没结果?

请问,搜索的结果能不能带一些文档的属性?

请问,搜索得到的结果能不能带一些文档的属性。

例如搜索得到的结果包括文档的创建人,创建时间,所属栏目等属性。
我是用数据库的某条记录作索引,返回的结果想带上这条记录的属性。

索引能不能不仅索引id,还能获取其它一些简单数据

比如:索引查询之后 能够返回文章的标题,作者等信息(不需要查找数据库),水平拆库拆表 极限情况 是 30条数据 要 有 30次socket连接(因为对应30个不同的数据库),这样查询 列表可以 直接从索引查到,而不是 仅仅只能获取id,再从数据库取数据

我想了解wukong背后设计流程

如题:
很想知道wukong的处理流程,整体设计,及文档建立索引是怎么回事;怎么讲倒排索引在硬盘上存储更小,查询更快

搜索关键词比文档多就找不到?

试了下,如果搜索关键词有任一一个在文档中找不到,该文档就不会被纳入搜索结果中。是不是可以加个选项,关键词可以选择按照【并且】(现在的),以及【或者】来搜索。即任何一个关键词在文档中出现就算搜到

股票代码分词不了

比如万科A的股票代码000002, 放到词典中,分词情况如下:
1、000002前后是中文或空格,比如"万科000002将于...",这时可以分词成功;
2、000002前后是英文,比如“new000002abc”,这时分词不了了
是不是哪里有配置呢?

载入索引文件太慢

我使用Wukong索引了数据库的一个字段并且将索引的文件存储在本地,然后在搜索阶段载入文件,但是载入相当慢。

关于demo占用大量内存的疑问

windows下跑了demo,内存占到近540M,整个weibo_data不到2M,为什么占这么多内存?

做大数据方面的应用,java跑8G都可以,go程序内存太大的话有没有问题?

貌似README.md中的例子出错

➜  server git:(master) ✗ go build wukong.go
# github.com/cznic/fileutil
/Users/leeight/hd/local/leeight.github.com/gopath/src/github.com/cznic/fileutil/fileutil_solaris.go:14: PunchHole redeclared in this block
        previous declaration at /Users/leeight/hd/local/leeight.github.com/gopath/src/github.com/cznic/fileutil/fileutil_darwin.go:14
/Users/leeight/hd/local/leeight.github.com/gopath/src/github.com/cznic/fileutil/fileutil_solaris.go:20: Fadvise redeclared in this block
        previous declaration at /Users/leeight/hd/local/leeight.github.com/gopath/src/github.com/cznic/fileutil/fileutil_darwin.go:20
/Users/leeight/hd/local/leeight.github.com/gopath/src/github.com/cznic/fileutil/fileutil_solaris.go:25: IsEOF redeclared in this block
        previous declaration at /Users/leeight/hd/local/leeight.github.com/gopath/src/github.com/cznic/fileutil/fileutil_darwin.go:25

太棒了!

wukong实在是太好了,精华中的精华,感谢huichen!

搜索添加的id大小有限制么 uint64 但是添加id为636160451050209280的数据的时候报错

panic: runtime error: index out of range

goroutine 52 [running]:
encoding/binary.PutUvarint(0xc20811a0b8, 0x8, 0x8, 0x8d4188f49000000, 0x8)
    /usr/local/go/src/encoding/binary/varint.go:48 +0x70
github.com/huichen/wukong/engine.(*Engine).persistentStorageIndexDocumentWorker(0x4640c40, 0x2)
    /Users/sunlei/go/src/github.com/huichen/wukong/engine/persistent_storage_worker.go:24 +0x140
created by github.com/huichen/wukong/engine.(*Engine).Init
    /Users/sunlei/go/src/github.com/huichen/wukong/engine/engine.go:199 +0x1652

第一条搜索结果被吃掉了

最近的改动导致搜索的第一条结果被吃掉了。即使我设置RankOptions.OutputOffset:0; 如果去掉OutputOffset, 那么第一条显示出来了,第二条丢了。
这怎么办呢?

wukong/testdata/crawl_weibo_data.go 无法构建运行

wukong/testdata/crawl_weibo_data.go **使用的两个包不存在项目中
import ( "flag" "fmt" "github.com/huichen/gobo" "github.com/huichen/gobo/contrib" "io/ioutil" "log" "os" "strings" "time" )

以下两个包不存在 项目工程中
"github.com/huichen/gobo" "github.com/huichen/gobo/contrib"

在某种情况下出现panic错误

您好,我使用了您的悟空搜索,线上稳定了运行了3个月左右,用于对于商品信息的搜索,但是昨天出现了严重的panic错误,导致程序奔溃了,panic错误如下:
2016/07/24 15:49:09 载入sego词典 data/dictionary.txt
panic: runtime error: index out of range

goroutine 1674871 [running]:
panic(0x9bccc0, 0xc82000a040)
/usr/local/go/src/runtime/panic.go:464 +0x3e6
github.com/huichen/wukong/engine.(_Engine).rankerRankWorker(0xf737e0, 0x1)
/opt/go/src/github.com/huichen/wukong/engine/ranker_worker.go:37 +0x24c
created by github.com/huichen/wukong/engine.(_Engine).Init
/opt/go/src/github.com/huichen/wukong/engine/engine.go:158 +0xeab
希望您帮忙解决下,注:sego词典我用的是空词典

开启NotUsingSegmenter后,程序会panic

引擎初始化开启NotUsingSegmenter,运行程序会出现panic,比如用以下例子:

package main

import (
"github.com/huichen/wukong/engine"
"github.com/huichen/wukong/types"
"log"
)

var (
// searcher是线程安全的
searcher = engine.Engine{}
)

func main() {
// 初始化
searcher.Init(types.EngineInitOptions{
SegmenterDictionaries: "../../data/dictionary.txt",
NotUsingSegmenter: true,
})
defer searcher.Close()

// 将文档加入索引,docId 从1开始
searcher.IndexDocument(1, types.DocumentIndexData{Content: "此次百度收购将成**互联网最大并购"}, false)
searcher.IndexDocument(2, types.DocumentIndexData{Content: "百度宣布拟全资收购91无线业务"}, false)
searcher.IndexDocument(3, types.DocumentIndexData{Content: "百度是**最大的搜索引擎"}, false)

// 等待索引刷新完毕
searcher.FlushIndex()

// 搜索输出格式见types.SearchResponse结构体
log.Print(searcher.Search(types.SearchRequest{Text: "中"}))

}

这个段程序无法执行。

评分规则必须要在建索引的时候指定么?

评论规则必须是在建索引的时候指定么?
评分规则�如果可以在search的时候进行指定的话,查询会更灵活吧?因为有时候在查询的时候,需要针对不同的filed进行排序获取最后的结果

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.