多项(lucene)查询是否可以仅对选定字段进行模糊搜索?

时间:2015-11-18 03:04:30

标签: c# lucene

我试图在更广泛的多项查询中为选定字段实施模糊查询。例如,我们假设字段为nameemail我想对名称进行模糊搜索,但我只想在email字段上进行完全匹配。

目前,我构建了这样的解析器(这是使用FlexLucene,所以这实际上是在C#中,但它应该与常规Java Lucene完全相同):

var parser = new MultiFieldQueryParser(fields, analyzer);

其中fields是包含string[]的{​​{1}},{"name", "email"}analyzer,与索引时使用的是StandardAnalyzer相同。 / p>

所以我正在拍摄的内容如下:查询字符串如" smith"应导致点击{ 'name': 'Harry Smith', 'email': 'harry@where.com' }{ 'name': 'Tom Smythe', 'email': 'tom@tom.com' }{ 'name': 'Sara Jones', 'email': 'smith@xyz.com' },而不是{ 'name': 'Tom Jones', 'email': 'smythe@abc.com' }

1 个答案:

答案 0 :(得分:0)

如果从代码中考虑创建查询,则应将查询创建为(对于java版本):

//match Smith Smythe
Query name = new PrefixQuery(new Term("name", name)) 
//match smith@xyz.com but not a smythe@abc.com
Query email = new PrefixQuery(new Term("name", name+"@")) 
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(name, BooleanClause.Occur.SHOULD);
builder.add(name, BooleanClause.Occur.SHOULD);
Query query = builder.build();

但据我所知,解析器需要你。 Lucene解析器有一个复杂的逻辑(通配符,增强等),并不清楚,你真正需要它。至于简单的解决方案,我可以建议覆盖方法getFieldQuery,如果未设置字段,则应创建类似上述描述的查询,否则将调用传递给parent。