有个空间

有个标题

lucene使用小记

几点小体会,先记下,不知道对不对。
网上说lucene是一个半成品,深有体会。
    1.lucene是一种全文搜索技术,词元是一个单词(word)。试图搜索一个单词的一部分或一个字母,是没有意义的,lucene也不能实现。除非你是想搜索一个单词的前缀,用PrefixQuery是可以的。说到底,还是在生成索引的时候的分析器(Analyzer)在作怪。
    下面有四个英文分析器:

分析器

内部操作步骤

WhitespaceAnalyzer

在空格处进行语汇单元的切分

SimpleAnalyzer

在非字母字符处切分文本,并将其转换为小写形式

StopAnalyzer

在非字母字符处切分文本,然后小写化,再移除停用词

StandardAnalyzer

基于复杂的语法来实现语汇单元化;这种语法规则可以识别e-mail地址、首字母缩写词、汉语-日语-汉语字符、字母数字等;小写化;并移除停用词



    切分出来的就是一个一个词元,也就是你搜索的最小单位了。不难从上面看出,lucene对亚洲字体支持有限。
    2.试过用StandardAnalyzer分析日文英文文本。日文可以正常搜索,英文字母只能按单词搜索。
    3.这里说一个奇怪的现象:搜索的时候,比如文本中有"你好bcc",我搜"好bcc"可以正常搜索,搜"好a"竟然也可以搜到。debug代码,看到查询的时候,有一个parse方法(下面说明)竟然把后面的"a"去掉了,真正搜的是"好"。但是搜"好b"或"好d"等都搜不到。奇怪奇怪!
    4.索引好之后,就可以搜索(Query)了。至于Query也有好多种:
     |_______WildcardQuery         (通配符查询)
     |_______PhraseQuery      (短语查询) 可以限定两个term之间的距离
     |_______RangeQuery            (范围查询)
     |_______MultiPhraseQuery    (多短语查询)
     |_______FuzzyQuery            (模糊查询)
     |_______SpanQuery              (跨度查询)
     |_______PrefixQuery             (前缀查询)
    查询的时候,也会用到上面的Analyzer。根据Analyzer的不同会对查询的关键词进行一些处理,比如上面的去掉"a"。然后用处理过的关键词进行查询。
    5.这里再说一个题外话:什么时候生成索引合适。总不能每次检索的时候就来一次从头到尾的生成索引吧,这显然不合人类工程动力学原理,呵呵:) 那初步想法是,先确定你要在那里文件里面搜索,每当你的这些文件有变动时,就触发对这个文件的索引。比如,新添文件或文件更新了。这样检索的时候,就只管检索。看似这样耦合度也低哈:)



posted on 2009-10-22 16:34 游雯 阅读(273) 评论(0)  编辑  收藏 所属分类: Java技术


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问