多术语 (lucene) 查询是否可以仅对所选字段进行模糊搜索

本文关键字:字段 模糊搜索 lucene 术语 查询 是否 | 更新日期: 2023-09-27 18:22:30

我正在尝试在更广泛的多术语查询中为所选字段实现模糊查询。 例如,假设字段是 nameemail我想对名称进行模糊搜索,但我只想在email字段上完全匹配

目前,我像这样构造解析器(这是使用FlexLucene,所以这实际上是在C#中,但它应该与常规Java Lucene完全对等(:

var parser = new MultiFieldQueryParser(fields, analyzer);

其中fields是包含{"name", "email"}string[]analyzerStandardAnalyzer,与索引时使用的相同。

所以我的目标如下:像"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' }

多术语 (lucene) 查询是否可以仅对所选字段进行模糊搜索

如果考虑从代码创建查询,则应将查询创建为(对于 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 ,如果未设置该字段,则应创建如上所述的查询,否则将调用传递给父级。