我试图在更广泛的多项查询中为选定字段实施模糊查询。例如,我们假设字段为name
和email
。 我想对名称进行模糊搜索,但我只想在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' }
。
答案 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。