[英]Can a multiterm (lucene) query do a fuzzy search on only selected fields?
我正在尝试对更广泛的多项查询中的选定字段实施模糊查询。 例如,假设字段为name
和email
。 我想对姓名进行模糊搜索,但是我只想在email
字段上完全匹配 。
目前,我像这样构造解析器(这是使用FlexLucene的,因此实际上是在C#中,但是它应该与常规Java Lucene具有完全的奇偶校验):
var parser = new MultiFieldQueryParser(fields, analyzer);
其中fields
是包含{"name", "email"}
的string[]
,而analyzer
是StandardAnalyzer
,与索引时使用的相同。
因此,我正在寻找以下内容:诸如“ 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' }
。
如果考虑从代码创建查询,则查询应创建为(对于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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.