类型说明
index
- 类似mysql的数据库(不是索引)
filed
- 类似表中的字段
document
- 类似数据行,基本数据单元
type
- 类似数据表
原理介绍
倒排索引
- 一般的数据库是通过文章->获取单词(正向索引),这个是通过单词->获取文章列表
- 首先通过单词建立字典树,val为链表或者bitmap
- 查询时候拿出所有词的list或者bitmap,取交集
bitmap和list的优缺点
- bitmap每个key需要维护一个和文章总数大小相同的bit数组,当文章非常多的时候内存不足,但是bitmap与运算非常快,相对于list包含一个文章的代价也比较小(只需要一个bit),适合用于文章总数不是很多,但是文章比较相似(包含的关键字非常多,每个关键词被很多文章包含)
- list每个词出现的文章成一个list,这个list太长时候浪费内存,list做与运算比较慢,需要先排序(当然插入时候就排序也可以)然后两两合并,适合用于文章短,但是很多,内容不一样,每个关键词包含的文章较少,合并通过归并的思想,1和2合并,得到的结果再和3合并
- 因此采用的方案可以是使用List,然后两两合并的时候将list转bitmap,然后通过bitmap的与操作(这样不用排序)
wukong源代码阅读
- 实话实说,没看到什么东西很特别,绝大多数都是上面的东西
- 悟空使用的还是基于list的合并方式
创建索引
{
"name": "message",
"storage_type": "disk",
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "standard"
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text" // 定义需要索引的数据名字和类型
}
}
}
}
- curl 创建索index
curl -u admin:cndsjc -X POST -H "Content-Type: application/json" -d '{
"name": "message",
"storage_type": "disk",
"settings": {
"analysis": {
"analyzer": {
"default": {
"type": "standard"
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text"
}
}
}
}' http://127.0.0.1:10004/api/index
参考
- https://zhuanlan.zhihu.com/p/33671444
- https://geekdaxue.co/read/ZincSearch-doc/search-type 中文文档地址