【问题标题】:How Lucene scores results in a RegexQuery?Lucene 如何对 RegexQuery 进行评分?
【发布时间】:2010-09-28 09:16:44
【问题描述】:

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

但是,Lucene 在使用 RegexQuery 进行正则表达式查询时如何计算分数?这是一个布尔查询——一个字段的值要么与正则表达式兼容,要么不兼容。 Lucene 无法从我的正则表达式查询中获取关键字并发挥其通常的魔力...

【问题讨论】:

    标签: regex lucene


    【解决方案1】:

    有两个通行证。首先,它生成与正则表达式匹配的所有术语的列表。其次,它会查找所有具有与该正则表达式匹配的术语的文档。

    您要查看的主要代码在 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 上实例化。因此适用标准坐标评分(即获得的术语越多越好)。
    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;
      }
      
      所以在某些时候,这将返回术语之间的距离(可能是列文斯坦)。但现在它什么也没做。

    【讨论】:

    • 在 2 中,您的意思是每个匹配项与其匹配字段值之间的距离,对吧?例如,如果有一个距离函数,使用正则表达式 ".*(dog|cat}.*" 和值 "my dog and cat are happy",它将如何发挥作用?
    • @maayank:Lucene 匹配术语,而不是字符串。因此,您的正则表达式 .*(dog|cat).* 将匹配与该正则表达式匹配的任何单个术语,这可能只是术语“狗”和“猫”,也可能是“热狗”之类的术语。我不确定他们将如何准确地计算距离,但我可以猜测它会遵循“将正则表达式的每个标记视为文字(无论它是否打算作为文字),然后计算距离。”就像代码说的那样,这只是猜测;现在,距离总是 = 1 :-)
    • 在索引获取整个值的正则表达式时,您总是不能分析/不标记值。正则表达式的每个标记是什么意思?正则表达式查询中的字符串“狗”和“猫”?这对我来说似乎有问题,因为它如何从“[^ABC]*\w[0-9]”之类的东西中解析出一个标记?非常感谢您的回答和cmets!
    • @maayank:关于不标记化的好点。我同意像 [^A] 这样包含“通用”内容的正则表达式很难找到距离,这可能是 lucene 开发人员尚未实现它的原因。我的理论(认为每个字符都在字母表中,然后像这样计算距离)显然是有缺陷的;但我真的不知道更好的解决方案。也许这是一个作为一般正则表达式问题的好问题?蒂姆的回答也不错。
    【解决方案2】:

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

    当然,这些值也很大程度上取决于正则表达式的质量,但在比较多个匹配项时,“更容易匹配”的匹配项可能比正则表达式引擎必须经过的匹配项更好扭曲。

    【讨论】:

    • 感谢您的回答!确实是一个有趣的指标。
    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 2013-03-01
    • 2013-06-08
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    相关资源
    最近更新 更多