[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做了紧耦合了吗? 随时更换分词器该如何? 比如,另一个应用中,都是日文、韩文的文档。 |