多术语 (lucene) 查询是否可以仅对所选字段进行模糊搜索
本文关键字:字段 模糊搜索 lucene 术语 查询 是否 | 更新日期: 2023-09-27 18:22:30
我正在尝试在更广泛的多术语查询中为所选字段实现模糊查询。 例如,假设字段是 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
,如果未设置该字段,则应创建如上所述的查询,否则将调用传递给父级。