2012-01-24 34 views
0

当通过空格拆分搜索查询时,例如在搜索名称时,术语“John Doe”将匹配结果“John”,“Doe”或“John Doe”而不仅仅是整个查询。这就是我现在这样做的:通过空格拆分Lucene查询字符串的最有效方法

BooleanQuery booleanQuery = new BooleanQuery(); 
String[] terms = queryString.split(" "); 
for(String term : terms) { 
    booleanQuery.add(new FuzzyQuery(new Term("firstName", term)), BooleanClause.Occur.SHOULD); 
    booleanQuery.add(new FuzzyQuery(new Term("lastName", term)), BooleanClause.Occur.SHOULD); 
} 

对我来说这种方法接缝有点杂乱。有更好的方法吗?

+0

为什么不使用QueryParser? – milan

+0

是的,使用QueryParser和WhiteSpaceAnalyzer(如果你只想分割空白) – naresh

+0

我用一个模糊的布尔查询,因为我想能够匹配部分单词,如Jon会拉起约翰等。QueryParser和WhiteSpaceAnalyzer可以实现这个吗? – ryandlf

回答

0

如果您没有使用简单的分析器,那么您的查询解析器是错误的。 You should analyze query terms the same way they were analyzed at indexing time

根据你正在做的事情,你应该把你的查询字符串与你的分析器分开。它不是强制性的,但如果你不这样做(例如,你可以拆分在空格,然后独立分析每一个字),你将需要解决一些(平凡)问题:

  • 做什么时分析一个词产生几个词(可以发生在化合物名称)?
  • 当这个词是一个停用词(不产生任何标记)时该怎么办?