xapian note 01

[1]. Index

xapian建立索引,参考https://github.com/xapian/xapian-docsprint/blob/master/code/c%2B%2B/index1.cc

主要涉及类:

数据库类 WritableDatabase

文档类 Document

Term生成工具类 TermGenerator


主要使用TermGenerator将输入内容转化为term并index,存放Document类数据中,实际保存的是Document类数据。Document分为两部分内容,一是原始数据,通过Document自己的方法添加;二是posting/index数据,通过TermGenerator添加。

TermGenerator基本工作过程:

1) set_document:设置目标doc。

2) index_text:将输入内容parse成term并添加。代码在termgenerator_internal.cc中。主要原理是将输入的内容先parse,然后逐个记录下位置,wdf,录入进doc中,如:

doc.add_posting(prefix + term, ++termpos, wdf_inc);   //termgenerator_internal.cc:258

term可以添加prefix;termpos即term在输入内容中的位置;wdf_inc为本次添加term的frequency权重(通常是1)

根据不同的策略添加为posting或单纯term,以及是否使用stem模式等等。

*) termpos 为Document类内部变量,连续的调用index_text方法会连续增加termpos。有时候想区分不同field的数据,可以在不同field的index_text之间插入隔断,方法为increase_termpos,默认是100位。原理即增加Document类中的termpos,下一次index_text即产生隔断。

*) Document类有docid,但往往输入数据有原始编号,可以将原始编号map进Document类中方便使用和管理。方法是add_boolean_term(idterm),idterm为原始编号。原理是为Document增加一个wdf为0的term,这样既能被识别到又不会对index计算产生实际影响。参考api中的说明。


写入数据库:使用WritableDatabase类的replace_document方法,添加/替换一个文档。replace_document可以指定unique_term,这是前面的添加的booleam_term就派上用场了。使用替换的原因是防止同一个doc被重复添加。

[2]. Search

index之后就可以检索,参考https://github.com/xapian/xapian-docsprint/blob/master/code/c%2B%2B/search1.cc

核心为两部分,QueryParser解析query,Enquire实现检索。

检索主要由Enquire类的get_mset(offset, pagesize)实现,返回结果中第offset ~ offset+pagesize顺位的结果。返回MSet类。MSet主要方法:mset.begin(); mset.end() 返回MSetIterator类用于遍历。对于MSetIterator类变量m,*m取结果的docid,m.get_rank()取结果的顺位,m.get_document()取结果的文档。

[3].facet

分面搜索facet值得是对于文档数据,在index的字段外,额外保存一些信息,不参与index,但是可以用于检索之后的统计和限定。例如搜索商品,通过关键词检索之后,引擎出了展示靠前的若干个商品,还能展示涉及的各个品牌都分别有多少商品。

参考 xapian文档关于facet的介绍index_facets

  search_facets

实现方法主要在于Document类中的set_value(),get_value()方法,以及ValueCountMatchSpy类。

index时,每个doc均可添加若干value slot,每个slot存一类信息。

ValueCountMatchSpy作用是在search返回mset过程中观测value。search时,新建ValueCountMatchSpy类spy,定义时指定slot,如

Xapian::ValueCountMatchSpy spy(1);

即指定观测slot 1上各个文档的value。将spy绑定到enquire上即可。如果需要分面搜索,使用get_mset时需要指定checkatleast,即

get_mset(offset, pagesize,checkatleast)

因为返回的mset一般只是整个March_Set中靠前的少部分结果,但是spy希望观测到较多的数据,因此可指定checkatleast值,表示至少要观测March_set中这么多的文档。如果checkatleast小于pagesize会取pagesize。

通过ValueCountMatchSpy的方法统计结果。如下:

for (Xapian::TermIterator facet = spy.values_begin();  facet != spy.values_end();   ++facet)

将spy中所有的facet value遍历,对于每个facet,调用 facet.get_termfreq() 统计该facet的频次。

注意这个遍历对于value而言是无序的(取决于spy存放value的顺序),对于有序的value类型(如数字)需要使用sortable_serialise。(TODO)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Solr&ElasticSearch原理及应用 一、综述 搜索 http://baike.baidu.com/it...
    楼外楼V阅读 7,253评论 1 17
  • 依稀记得15年8月北京之行,夜晚在幽静的山谷里躺在凉席上看星星的情景。好多颗流星划过天际,划出美丽的身影。那时才...
    kitty99阅读 296评论 0 0
  • 落丛勇为草中英,入口偏能洗涤烦。一撮春色见日月,半铛泉水煮山川!
    李炼阅读 211评论 0 1