Lucene如何在RegexQuery中得分?

时间:2010-09-28 09:16:44

标签: regex lucene

我可以看到,在进行常规/模糊全文搜索时,可以比较两个值,以确定哪个值“更好”(即一个值包含的关键字多于另一个,一个包含的关键字少于其他)。

然而,Lucene在使用RegexQuery进行正则表达式查询时如何计算得分?它是一个布尔查询 - 字段的值与正则表达式是否兼容。 Lucene无法从我的正则表达式查询中获取关键字并执行其通常的魔术......

2 个答案:

答案 0 :(得分:4)

有两个通行证。在第一个中,它生成一个与正则表达式匹配的所有项的列表。在第二个中,它会查找所有与该正则表达式匹配的术语。

您想要查看的主要代码是MultiTermQuery:

public Query rewrite(IndexReader reader) throws IOException {
  FilteredTermEnum enumerator = getEnum(reader);
  BooleanQuery query = new BooleanQuery();
  try {
    do {
      Term t = enumerator.term();
      if (t != null) {
        TermQuery tq = new TermQuery(t);      // found a match
        tq.setBoost(getBoost() * enumerator.difference()); // set the boost
        query.add(tq, false, false);          // add to query
      }
    } while (enumerator.next());
  } finally {
    enumerator.close();
  }
  return query;
}

两件事:

  1. 使用coord on实例化布尔查询。因此标准坐标评分适用(即您获得的术语越多越好)。
  2. 术语查询的提升由enumerator.difference()给出。但是,从3.0.1开始,这只返回1:
    
    @Override
    public final float difference() {
    // TODO: adjust difference based on distance of searchTerm.text() and term().text()
    return 1.0f;
    }
    
    因此,在某些时候,这将返回术语之间的距离(可能是levenstein)。但是现在它什么也没做。

答案 1 :(得分:1)

这只是一个疯狂的猜测,但一个可能的指标可能是正则表达式引擎匹配搜索字符串所需的回溯步数。

当然,这些值也很大程度上取决于你的正则表达式的质量,但是当比较几个匹配时,“更容易匹配”的那个可以被认为是比正则表达式引擎必须经历的匹配更好的匹配扭曲。