【发布时间】:2010-09-28 09:16:44
【问题描述】:
我可以看到,在进行常规/模糊全文搜索时,如何比较两个值以确定哪个“更好”(即一个值包含的关键字比另一个值多,一个值包含的非关键字比其他)。
但是,Lucene 在使用 RegexQuery 进行正则表达式查询时如何计算分数?这是一个布尔查询——一个字段的值要么与正则表达式兼容,要么不兼容。 Lucene 无法从我的正则表达式查询中获取关键字并发挥其通常的魔力...
【问题讨论】:
我可以看到,在进行常规/模糊全文搜索时,如何比较两个值以确定哪个“更好”(即一个值包含的关键字比另一个值多,一个值包含的非关键字比其他)。
但是,Lucene 在使用 RegexQuery 进行正则表达式查询时如何计算分数?这是一个布尔查询——一个字段的值要么与正则表达式兼容,要么不兼容。 Lucene 无法从我的正则表达式查询中获取关键字并发挥其通常的魔力...
【问题讨论】:
有两个通行证。首先,它生成与正则表达式匹配的所有术语的列表。其次,它会查找所有具有与该正则表达式匹配的术语的文档。
您要查看的主要代码在 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;
}
两件事:
@Override
public final float difference() {
// TODO: adjust difference based on distance of searchTerm.text() and term().text()
return 1.0f;
}
所以在某些时候,这将返回术语之间的距离(可能是列文斯坦)。但现在它什么也没做。【讨论】:
这只是一个疯狂的猜测,但一个可能的指标可能是正则表达式引擎匹配您的搜索字符串需要采取的回溯步骤数。
当然,这些值也很大程度上取决于正则表达式的质量,但在比较多个匹配项时,“更容易匹配”的匹配项可能比正则表达式引擎必须经过的匹配项更好扭曲。
【讨论】: