几点小体会,先记下,不知道对不对。
网上说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.这里再说一个题外话:什么时候生成索引合适。总不能每次检索的时候就来一次从头到尾的生成索引吧,这显然不合人类工程动力学原理,呵呵:) 那初步想法是,先确定你要在那里文件里面搜索,每当你的这些文件有变动时,就触发对这个文件的索引。比如,新添文件或文件更新了。这样检索的时候,就只管检索。看似这样耦合度也低哈:)