|
  
- UID
- 1
- 帖子
- 4814
- 精华
- 41
- 积分
- 555
- 阅读权限
- 200
- 来自
- 中国PHP联盟
- 在线时间
- 576 小时
- 注册时间
- 2007-12-10
- 最后登录
- 2010-7-29
|
再谈Xapian;
之前写过一篇Xapian学习笔记, 今天因为Stage2中需要再次用到全文搜索, 所以再次把Xapian的文档翻出来看了看.
看了很多别人的代码, 才发现自己的Xapian代码是最傻瓜化的写法.
我的所有Terms都是由TermGenerator产生的,
实际上, 可以通过document->add_term(term, [term_count=1])来添加自定义的term,
特别的, 对term添加一个prefix可以在之后的搜索中, 作为选择器用.
比如, 我们建立了一个全文索引库, 用于保存和索引各类的代码参考文档,
这些参考文档从PHP, Python, Java到Ruby…. 各种编程语言的都有,
为了区分不同的编程语言, 我们打算使用一个自定义的term来标记.
对于所有Python语言的文档, 这个term毫无疑问, 应该是是”Python”.
不过, 仅仅”Python”是不够的, 因为”Python”这个词可能在任何地方出现, 甚至在有关Ruby的一篇文章中被提及,
如果我们想提供给用户一个编程语言过滤器, 仅仅去搜索”Python”这个term不可避免的会搜索出许多不相干的条目.
怎么做呢? 可以给这个编程语言的term, 加上一个prefix, 如”PL”, 这样”Python”这个term就变成了”PLPython”.
在进行搜索的时候, 可以通过queryParser->add_prefix(’language’, ‘PL’) 方法, 给language字段添加prefix过滤器”PL”,
这样, 只要提交搜索的时候, 使用词法: language ython (可由前台生成), 我们就完成了对编程语言的特异性过滤.
————— 分割线 ——————
再回头看, 当时我为了保存一篇帖子的信息, 我用了一个JSON,
将帖子的ID, 标题, 正文都打包成为JSON后, 放在了document的data里,
事实上, 今天看文档才发现, 每个文档除了data外, 还有可以自由添加的value,
通过document->add_value(keyno, value), 可以添加value到keyno索引下.
这样可以将正文放在data下而将其他的信息都添加到document的values中, 避免了JSON的封装与解析.
当然keyno不能重复, 也不是一个类似索引数组中的key,
不过只要自己定义好常数, 用起来还是很简单的.
————— 分割线 ——————
类似于TermGenerator, QueryParser其实也可以不用, 而自己构造Query对象,
传递给其terms和逻辑运算符即可.
而且似乎使用自己构造的Query对象, 可以添加子查询? 这个还没有研究太多.
我以前一直觉得Xapian的构造太简单粗放,
现在才发现是自己了解得太浅显.
我的陈旧的Xapian调用库, 可以更新了  |
|