[lucene] 搜索的时候,让分词器自动分词和空格的区别

TonyLian 2010-02-02
Query searchQuery = null;

// Lucene标准写法
QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "CONTENTS", analyzer);
searchQuery = parser.parse(q);

// IK推荐写法
searchQuery = IKQueryParser.parse("CONTENTS", q);


如果q是“感染甲流”,虽然分词器,可以将其分为“感染”和“甲流”
但是所组成的 BooleanQuery中的BooleanClause这两个词之间的关系,却是“MUST”!!也就是 AND 的关系!



如果查询条件改为“感染 甲流”,即加个空格,人为将两个词分开。
则得到的BooleanClause这两个词之间的关系就是“SHOULD”了(OR)

总之,如果我们搜索时不人为加空格,让分词器自己去分,那么必须两个词同时出现在一个文档中的,才会被查出了。

而如果人为加了空格,只要出现一个词的文档,就会被查出。

请问高手,前者(不加空格)能否也达到和后者(加空格)相同的效果呢?即只要出现一个词的文档,就被查出?
TonyLian 2010-02-06
研究了一下Google的搜索结果(因为Google的搜索结果太多了,所以不好研究)
似乎也是这样的。有意为之!?细想起来,也有些道理。
kernaling.wong 2010-02-07
其实,你不一定要跟Lucene的QueryParser方法.推荐只是一个建议不一定要照做.要做一个不听话的程序员才有风格嘛.

IKSegmentation se = new IKSegmentation(new StringReader(keyWords), true);
Lexeme le = null;
BooleanQuery bq = new BooleanQuery();
while((le=se.next())!=null){
String tKeyWord = le.getLexemeText();
String tFeild = fiels[i];
TermQuery tq = new TermQuery(newTerm(fiels[i],KeyWord));
        bq.add(tq, BooleanClause.Occur.SHOULD); //关键字之间是 "或" 的关系
}
这样就可以了。
naughty610 2010-02-07
个人也是觉得如果所有的关键字之间都是and的关系,那么搜索结果也有可能出现用户许希望得到的。比如说他的关键字填写错误。。。
用or的关系吧。将反回的文档按照包含关键字的个数,来排序。
这个是我最近自己写搜索代码的搜索的思路。
希望相互交流:qq 32139906
naughty610 2010-02-07
既然你的问题是也想得到仅仅包含一个词的文档,那么就将分词的结果分别作为搜索关键爱你字传到lucene中搜索吧。这样就能得到所有的文档了。在将二者取交集,不就是你想要的结果么
TonyLian 2010-02-08
kernaling.wong 写道
其实,你不一定要跟Lucene的QueryParser方法.推荐只是一个建议不一定要照做.要做一个不听话的程序员才有风格嘛.

IKSegmentation se = new IKSegmentation(new StringReader(keyWords), true);
Lexeme le = null;
BooleanQuery bq = new BooleanQuery();
while((le=se.next())!=null){
String tKeyWord = le.getLexemeText();
String tFeild = fiels[i];
TermQuery tq = new TermQuery(newTerm(fiels[i],KeyWord));
        bq.add(tq, BooleanClause.Occur.SHOULD); //关键字之间是 "或" 的关系
}
这样就可以了。


这样不就和IK做了紧耦合了吗?

随时更换分词器该如何? 比如,另一个应用中,都是日文、韩文的文档。
Global site tag (gtag.js) - Google Analytics