【问题标题】:Can a multiterm (lucene) query do a fuzzy search on only selected fields?多项(lucene)查询能否仅对选定字段进行模糊搜索?
【发布时间】:2015-11-18 03:04: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' }

【问题讨论】:

    标签: c# lucene


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 2019-07-05
      • 2020-06-25
      相关资源
      最近更新 更多